Заметки за 2026 год

Игра на конкурс Dungeon Crawler

На сайте gamedev.ru я зарегистрирован с 28 сентября 2004 года. Но никогда не создавал тем, участвовал в паре обсуждений, а в основном просто читал форум. В том числе темы по игровым конкурсам.

1 февраля 2026 года на GameDev.ru стартовал конкурс Dungeon Crawler. Жанр мне зашёл: мне нравятся старые Might and Magic, пошаговые приключения, пиксельная графика и подземелья. А 2 февраля я оставил в теме сообщение: «Всем привет! Заявка». После заявки оставалось сделать маленькую вещь — игру.

Eye of the Beholder 2
Eye of the Beholder 2

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

Dungeon Master 2
Dungeon Master 2

На тот момент у меня были только тесты и наброски. Игру, которую можно пройти от начала до конца, я ещё не делал.

Изначальная идея

Набросал, что хотел бы видеть в игре:

  • Пошаговое передвижение и бои, как в Eye of the Beholder или Dungeon Master.
  • Игровой цикл: поход в подземелье, возвращение, улучшение снаряжения.
  • Цель — собрать семь магических артефактов (может, сделать комплект брони?).
  • Прохождение примерно за час.
  • Стартовая локация с порталом, магазином и местом для сбора артефактов.
  • Игрок входит в портал и попадает в случайно генерируемое подземелье, в процессе исследования решает загадки, убивает монстров и собирает лут.
  • В каждом подземелье есть шанс найти артефакт.
  • Найдя выход из подземелья, игрок возвращается через портал в стартовую локацию и может улучшить и пополнить снаряжение в магазине.
  • Продавец — монстр.
  • Магазин открывается после прохождения первого подземелья.
  • Подземелье меняет оформление после каждого собранного артефакта.
  • После сбора всех семи артефактов портал меняется и открывается финальное подземелье с боссом.
  • После выхода из финального подземелья игрок оказывается у портала на природе в красивом месте.
  • У игрока три жизни. В стартовой локации они показаны светящимися камнями. После третьей смерти игра заканчивается.

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

Сначала — редактор, потом игра

Первый проект назывался Umberrift, «Теневой разлом». Я завёл его 6 февраля в Godot 3.6.2. Сразу появились заставка, логотип, меню, шрифты, тема и даже переводы. Игрок ещё не может пройти по подземелью, зато меню у него уже есть.

Первое меню
Первое меню

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

Редактор уровней
Редактор уровней

К 21 февраля нарисованную карту уже можно было запустить как уровень. Появился персонаж с поворотами и шагами на Q/E/W/A/S/D. Нарисовал стену, сохранил карту, запустил игру — стена на месте. Правда, почти вся остальная игра пока существовала только в планах.

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

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

Немного своего движка

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

И я решил попробовать.

C++ и Direct3D 11

В начале марта я попробовал Umberrift на C++. За два дня сделал полноэкранное окно Windows, подключил Direct3D 11, добавил переключение экранов и загрузку ассетов. Вывел картинку в 640×360. Подземелья там почти не было: я проверял, могу ли сам управлять окном, рендером и масштабированием.

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

Odin и Raylib

Потом был Odin. Я возился с виртуальным буфером, масштабированием под монитор, полноэкранным режимом, заставкой, шрифтами, экранами и информацией о кадре. По коммитам видно: вся эта техническая часть занимала меня больше, чем подземелье.

Меню игры версии на Odin + Raylib
Меню игры версии на Odin + Raylib

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

Уровень игры версии на Odin + Raylib
Уровень игры версии на Odin + Raylib

Мир из клеток на Godot 4

Испугавшись объёма работы над своим движком, в середине марта я вернулся к Godot. Решил попробовать версию 4.6 — топовую на тот момент. Уровень хранился как данные о клетках, а генератор строил по ним пол, стены, потолки и колонны. На отладочных комнатах проверял, как всё стыкуется в 3D. Игрок снова ходил по сетке, упирался в стены, стрейфил и плавно поворачивался.

Хранение данных об уровне в коде
Хранение данных об уровне в коде

Появились туман, свет у игрока, мерцающий факел; сама сцена стала темнее. Если попытаться пройти сквозь стену, камера слегка толкалась.

Уровень игры версии на Godot 4
Уровень игры версии на Godot 4

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

Я начал понимать, как лучше устроить архитектуру игры.

Umberrift с настоящим редактором

В начале апреля я начал ещё один Umberrift на Godot 4.6 — самый большой из ранних проектов. Снова проверил движение и столкновения, собрал сцены каменных модулей. Потом занялся материалами пола и стен, импортом мешей, размером комнат и рамкой игрового экрана.

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

Редактор второй версии игры на Godot 4
Редактор второй версии игры на Godot 4

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

Пример уровня второй версии игры на Godot 4
Пример уровня второй версии игры на Godot 4

На Godot 4, как мне казалось, получался слишком большой экзешник. К Odin тянуло в надежде сделать игру компактнее и быстрее. Ну и был спортивный интерес — сделать самому, на «низком уровне».

Ещё раз Odin: теперь про правила игры

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

Меню игры на Odin + Raylib
Меню игры на Odin + Raylib

Во второй попытке я наконец занялся правилами. То, с чего вообще нужно было начинать!

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

Ранний Umberrift был про карту и движение по клеткам. Здесь уже появились определения оружия, шаблоны врагов, инвентарь с экипировкой. Карты загружались из встроенных данных; на них стояли двери и нажимные плиты.

А потом я опять занялся редактором. К концу мая он стал отдельным приложением. Игра отдельно, инструмент отдельно — звучит хорошо!

Редактор уровня на Odin + Raylib
Редактор уровня на Odin + Raylib

Нам нужен персонаж!

В начале июня я снова открыл Godot 3.6 и сделал маленький Dungeon почти целиком про создание персонажа. Заставка, меню, тема, портреты, имена, архетипы, характеристики, здоровье и мана. Полноценного уровня не было: герой уже создавался, а отправить его было некуда.

Экран создания персонажа
Экран создания персонажа

Dungeon, который дошёл до конкурса

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

По числу черновиков можно было подумать, что я участвую в конкурсе на лучший способ начать делать Dungeon Crawler. Увы, такой номинации не было.

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

23 июня я создал отдельный репозиторий. В README зафиксировал: один герой, вид от первого лица, клеточное движение, Godot 3.6.2 и GLES2.

Ориентиром было старое слабое железо, тестовой платформой служил мой ноутбук на процессоре Celeron N4020C с интегрированной Intel UHD Graphics 600.

Для графики выбрал low-poly-модели, пиксельные текстуры и интерфейс с небольшим базовым разрешением 640×360. Целевой размер сборки — до 50 МБ.

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

Каменные полы, стены, колонны и потолки делал в Blender, переносил в игру и размещал через MeshLibrary и GridMap. Позже к ним добавились арки, решётки, светильники и двери.

Создание пола и стен
Создание пола и стен

Герой получил клеточное движение со стрейфом и поворотами; RayCast проверял препятствия. Шаг стал плавным, появились повторение движения при удержании клавиши и свободный обзор без изменения направления героя на сетке. Похожее сочетание сетки и плавного шага я уже пробовал в марте на Odin. Теперь оно работало внутри уровня Godot.

Для комнат я запекал освещение: движок сохранял рассчитанный свет в текстурах. После каждого изменения положения факела в сцене освещение приходилось запекать снова.

Запечённое освещение
Запечённое освещение

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

Уровень, собранный с помощью GridMap
Уровень, собранный с помощью GridMap

От прогулки к игре

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

HUD стал показывать состояние героя и предметы в руках. Миникарта запоминала замеченные стены и двери, позже появилась полная карта.

Игровой интерфейс
Игровой интерфейс

Сложные модели я генерировал в Meshy по референсам. Затем в Blender очищал геометрию и вручную делал UV-развёртку. Потом возвращался в Meshy и запекал текстуру.

Reaper в Meshy.AI
Meshy.AI

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

Окно инвентаря
Окно инвентаря

Оружие и броня занимали места в экипировке и меняли характеристики, зелья можно было выпить, а индикаторы рук показывали выбранное снаряжение в HUD.

Экран создания персонажа
Экран создания персонажа

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

Экран персонажа
Экран персонажа

Экран персонажа показывал его параметры, а позднее я объединил его с инвентарём.

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

Музыка меню, дождь у входа и звуки действий дополнили подземелье.

Монстры, бой и цель

В игру пришли Ratfiend и Reaper. Они патрулировали уровень, замечали героя, преследовали его и искали после потери из виду. Передвижение противников оставалось клеточным: общая с героем система хранила занятую клетку и резервировала следующую на время шага.

Rat Fiend
Rat Fiend

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

Reaper
Reaper

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

Гоп-стоп
Гоп-стоп

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

Единая игровая карта
Единая игровая карта

Теперь маршрут вёл через исследование комнат, добычу и встречи с монстрами к выходу. На уровне появились подсказки об управлении, предметах и атаке; отдельно я сделал экран управления. Большая карта помогала увидеть исследованные проходы и закрытые двери.

Иллюзорная стена
Иллюзорная стена

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

Оптимизация и перестройка уровня

По мере расширения уровня я занимался производительностью на слабом железе. Ограничил дальность прорисовки и работу далёких эффектов, уменьшил объём данных запечённого света. Монстры создавались поблизости от героя, их экземпляры переиспользовались, а поиск пути распределялся по кадрам. Уменьшил расстояние, на котором слышны звуки. В игре появились показатели производительности.

Модульная комната
Модульная комната

До сентября первый уровень оставался большой сценой с GridMap. 7 сентября я пересобрал уровень из отдельных сцен и добавил порталы видимости. Старые библиотеки MeshLibrary и корневую сцену первого уровня убрал; у комнат были своя геометрия, объекты и свет.

После перехода пришлось исправлять видимость объектов в комнатах: ближе к релизу Godot скрывал монстров и движущиеся части дверей, сундуков и рычагов. Сами комнаты остались основой всех трёх уровней.

Три уровня и релиз

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

Карты уровней в Lunacy
Карты уровней в Lunacy

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

Для проверки маршрута я добавил автоматизированное прохождение с взаимодействиями, добычей и боем. Оно шло через все три уровня, а не проверяло отдельную дверь или сундук. К конкурсной сборке написал «Руководство искателя» с управлением, правилами боя, инвентарём, картой, факелом и сохранением.

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

Релиз
Релиз

На форуме я выложил релиз и Windows-сборку версии 1.0.5 — именно она ушла на судейство. 13 сентября Dungeon был в списке конкурсных работ как «IVV79 — Dungeon». После сдачи разрешались только патчи критических ошибок. Так появилась версия 1.0.6: я поправил бой, появление героя на втором и третьем уровнях, видимость дверных рам и ещё раз запёк свет, после чего выложил патч отдельным архивом на форуме.

И понеслись стримы и отзывы!

Стрим Ducat
Стрим Ducat

Больше всего хвалили атмосферу и картинку: писали про «ощущение подземелья», дух игр девяностых, вспоминали Legend of Grimrock и даже говорили, что игра уже выглядит как небольшой коммерческий продукт.

Стрим Week of the agents
Стрим Week of the agents

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

Вылезли и более конкретные проблемы: на третьем уровне встретилась невидимая решётка. А когда один из игроков добрался до финального артефакта, у него уже был забит инвентарь. Пришлось бегать туда-сюда освобождать место. Зато сам данж людям хотелось исследовать — пожалуй, для Dungeon Crawler это был самый приятный отзыв.

Итоги

Долгий месяц ожидания результатов.

Барабанная дробь… ПЕРВОЕ МЕСТО!

Честно, победы я не ожидал, хотя один из стримеров говорил, что это, наверное, первое место.

Результаты конкурса
Результаты конкурса

Что дальше

Я немного доработал конкурсную версию: поправил боёвку и исправил все недочёты, отмеченные судьями. Текущую версию 1.0.8 можно скачать здесь.

Теперь сроки конкурса меня не поджимают, и я могу сделать игру такой, какой задумал её в самом начале. И да, теперь это снова Odin и Raylib с редактором! 🤣

Новая игра
Новая игра
Новый редактор
Новый редактор