Рисование Бумажного подземелья или "как это было"

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

qBVIvHj

Внимание: много картинок!

Читать много слов и истории из глаз разработчика прямо в продолжении поста!

До Гаминатора

Кажется, у меня как раз было желание сделать какую-нибудь игру, чтобы хоба и игра готова, вернее 2-3 недели было бы как раз. И тут анонсируют конкурс — удачное совпадение!

И опять же совпадение — как раз была (и заканчивалась?) скидка на GameMaker: Studio 2. Был сложный выбор между покупкой UWP версии для некоторых целей, но немного изучив это, взвесив все за-и-против (или же бросив кубик D6 ?!) — решил взять стандартную версию для Win\Lin\Mac.

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

Анонс и тема

Конечно меня сразу понесло делать игру без темы, потому что нужна была какая-то основа. Сундук-мимик Анима86 сразу конечно навеял мысли о подземельях и вот этом всём. 

Решил я взять код из режима Вояжора Пистона, а как оказалось — выдрать было очень сложно, много проникающих друг в друга кодовых основ и всего прочего. Так что случилось как со Взертосом, который был основан на Ludum Dare-овских Орках — пришлось всё переписывать практически с нуля, но хоть с какой-то основой.

Играние с темой конечно было забавным. Ожидаешь что-то, но то, что кажется очевидным — слишком очевидно! Очень поугадовали тему и на самом Гамине и в Телеграмм чате, но конечно самое эффектное угадывание было для меня в очень-локальном-ТГ-чате:

TywJhjy

22 сентября, ДД (т.е. ДаркДес) случайно попал точно в цель. Фото в цвете.

wlh1e79

Неожиданный поворот. Особенно для меня.

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

Собственно по пси-полям удалось предсказать две вещи — тему Гаминатора и то, что случилось с моим (не)могуществом.

Ручку в руки через руку или пошла жара

Очень много и часто показывал свой прогресс в ТГ-чате Гамина, скриншоты там, гифки. Муки выбора и прочее.

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

Ради теста я так же попробовал конвертнуть целого Взертоса с ГМС1 на ГМС2. И знаете что? Кажется всё работает умеренно идеально. Т.е. если учесть достаточно кривой код, баги и вот это всё — Взертос даже запустился и немного поигрался. После небольшой модификации конечно (но это проблемы выпиливания одной функции из ГМС1 наверно).

Конечно конвертировать проекты я бы не стал больше. «Обёртки» над старыми функциями выглядит как куча мусора и хлама + создаются всякие странные около-хаки с глубиной, ведь в ГМС2 теперь это работает иначе.

Например, вот скриншот конвертации и первого запуска Подземелья:

wgQ5EaU

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

Вообще от того самого Подземелья осталось очень не много, многое было переделано, переписано, пере-что-нибудь-потому-что-это-ГМС2.

А вот это по сути уже именно подземелье бумажное:

OdJByAY

Не знаю когда точно, но кажется ещё до начала работы над «прототипом» сформировалась идея, что графически всё это должно быть нарисовано на бумаге, а затем сканером прогнано. По итогу конечно получился немного не такой эффект, но кажется даже интереснее — это было бумажное пиксельное 3д на гейммейкере, Карл!


Что там дальше чем 3д?

Когда-то давно начинал систему инвентаря писать, чтоб как в Диябло — grid-based инвентарь, на ГМС1. Ключевой момент конечно в том, что «начал», но было готово примерно 80% всей такой системы.

7wZARYb

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

Добавив хоть какой-то инвентарь и частичную его работу я ВНЕЗАПНО ударился в написание шейдера. Начало было примерно такое:

akuPBHu

Забавный факт: подобный шейдер изначально я хотел написать для тестов визуального стиль для некоторого проекта на букву V. Но тогда у меня на тестовом полигоне в виде картинки (а не 3д сцены) ничего не получилось.

Есть некоторая гифка, где есть изображение неправильной версии этого шейдера, но мне показалось это забавным:

fwOgEVa

А это просто интересное цветное подземелье:

3BxFRBc

И примерно где-то здесь заканчиваются «секретные» скриншоты, дальше визуальное развитие относительно минимально — разве что инвентарь и интерфейс менялись, а так, всё осталось, шейдеры, например:

iU0UftC

Но вот пара забавных багов:

9Ky5fj8

sDL2fjs

Ещё вот тут «чернильная тень» интересно выглядела:


Генерируй!

Вспоминал как генерировать подземелья по BSP, но в итоге пришлось подгонять реализацию снова. Уже третий раз наверно пишу, но повторение  — это этсамое.

fGJOwZe

Не без проблем конечно, но по итогу стало более-менее нормально и стабильно.
Затем ещё добавил генерацию по старому принципу (из Вояжора-Подземелий), которую в скриптах назвал snake, но настоящее название не знаю. Суть генерации «змейкой» в том, что берётся N попыток и каждую попытку в ячейку записывается «проходимость» и случайно выбирается направление следующего движения.

8MRGJHV

А ещё мне выпала «Нежить» в Овервотч. Разери, где мой микрофон!?171  ЭТО ЖЕ ЛУЧШАЯ НЕЖИТЬ!


Было и вот такое:

OzeXe4P

И даже такое:

osNTNCt

И не без этого конечно:

bHZRDkm


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

Почему вот-такой-вот сюжетный поворот, а не другой? А где тема Гаминатора? Да вот же она! Как не видно!?

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

Нелогичность некоторых вещей «игровой логики» — тоже по сути вырастали из чего-то вроде багов или нелогичных. Почему курица воскрешает игрока после смерти? Простопотомучто!

А щит? Почему он не защищает? А ловкость? Разум? Что вообще!? Ну во всех же играх работает и важно, почему же здесь нет? Мне кажется, что ... .

Ошибка, которая действительно оказалась сильной ошибкой (тут не знаю — логической?), что баланс оказался сломан в край. Ну и с восстановкой ХП конечно тоже. Как-то с успеванием участия забылась логика генерации и в итоге в коде прописалась логика для «0.1» добавления, а в БД предметов оказалась логика «1.1» множителя.


Немного итогов


Специальный раздел: 3д функции в GMS2

Кажется, меня попросили чуть подробнее о 3д в ГМС2. Но думаю этот подраздел будет о общих впечатлениях о ГМС2.

Собственно визуально-то всё прикольно, но иногда было такое, что:

kUw6hV7

Или например:

26ubXpJ

Но чаще конечно вот это:

MNx8fyh

И конечно  «Не отвечает» на ровном месте. Но это может показаться, что на ровном месте, на самом деле думаю закономерность была — чаще всего при сборке игры в exe\zip.

***

И так, про само 3д. ГМС2 от ГМС1 в этом плане сильно отличается. Многие функции убрали, другие переименовали, третьи ... так сказать, дополнились — матрицы.

Все функции d3d_* и даже удобные d3d_model_* реализации которых всё равно были скрыты и работали непонятно как, но ПРОСТО — тоже убрали.

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

Другие функции хоть и обновили, но всё равно не достаточно. Не знаю, «наследие» ли это, но в дебагере до сих пор есть строчка про Stencil buffer, доступ к которому ни ГМС1, ни ГМС2 не даёт. Вопрос тогда — зачем?

Но теперь можно хоть поставить функцию-константу на тест глубины — уже шаг в будущее ... или прошлое? Хм. А шейдеры так и не могут писать в float — по итогу изображений у нас обычный A8R8G8B8

(На правах попытки объяснить за матрицы по просьбе:)

Не преподаватель из ВУЗа я, а кому-то и в школах говорят матрицы преподносят.

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

Скажем, вот есть куб в 3д. По сути и всё. Ничего не видно. Чтобы что-то узреть — нужно настроить матрицу проекции. Но и этого будет недостаточно — нужна ещё и матрица вида.

Вершина 3д модели проходит примерно такое преобразование:

итоговая_вершина = вершина_модели * матрица_мировая * матрица_вида * матрица_проекции.

Порядок перемножения очень важен, но этого вот эту «формулу» не нужно делать самому — ГМС уже так делает сам. Главное задать матрицы в каждый «слот».

Мировая матрица — это по сути трансформация конкретной модели для отрисовки. Нужно, чтобы модель чайника крутилась по оси Z в зависимости от времени? Строите матрицу поворота по Z и готово!
Нужна более сложная трансформация? Опять же — порядок очень важен.
Если сначала сместить модель, затем повернуть, то поворот будет относительно 0,0,0 точки.
Поэтому нужно сначала повернуть на нужные углы (если повороты нужны относительно центра модели), затем если нужно — использовать масштаб, а под конец — смещение.

Матрица вида — это камера. Кстати о камерах — в ГМС2 теперь завезли их «из коробки», лично я думаю, что это плюс, хоть и чуть сложнее стало. Но в каждой своей игре я всё равно делал объект «камера» и несколько скриптов к ней. Однако, это камеры 2Д (хотя можно и для 3д, но ->) однако они не заточены для 3д. Т.е. есть функция установки позиции, но ... только для 2д. Спрашивается — зачем тогда?

Матрица проекции — сравнимо с правилом искажения. Т.е. именно эта матрица делает 3д таким 3д, к которому привыкли. Чтобы в дали объекты были меньше, а у носа игрока — размером с экран. Искажение по X\Y, чтобы на широкоформатных мониторах картинка не растягивалась. Так же может быть не только перспективная проекция (3д), но и ортогональная(2д игры), при этом последняя — может быть и в 3д! В 3д графических редакторах например часто используется 3д ортогональная проекция (хотя по факту это именно просто ортогональная — «3д-шность» ей даёт матрица вида, которая изображает точку наблюдения и взгляда в 3д пространстве).


Специальный раздел: обновлённая версия Бумажного Подземелья

СКАЧАТЬ ЗДЕСЬ 

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

Как минимум теперь там есть лук и стрелы! Сундуки теперь показывают пустые ли они (если не зелёный, то пустой), подходя к предмету на полу можно узнать что за предмет, например.

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

Так что возможно будет и ещё одна версия, а может и пару — надо смотреть.


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


Специальный раздел: как это рисовалось

Как я указал в Ридми файле к игре — рисовалось это линером из Ашана. Тот момент когда фраза «берёшь@рисуешь» точно описывает графику для этой игры. Взял листочки в клеточку и рисовал там по каким-то своим правилам.

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

YRihSBQ

Ещё одновременно с Гаминатором проходил Inktober, в который я немного порисовал, а потом слился.

А вот это первый скан первых ассетов для игры:

X7dnGo7


Мне очень повезло, что 0int решил помочь с музыкой. Я бы точно не написал что-то хорошо, а что планировал — не успел бы. Но зато у меня было больше времени (примерно на 20 секунд) чтобы поработать над звуками!

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

Да, какое-то время просидел в Аудасити ещё, чтобы выбрать нужные. Было даже несколько «рейдов» на звуковые волны. Но самым урожайным был первый конечно — там кажется было 6 минут чего-то. 

Открывание сундука это кстати открывание и закрытие ящика стола, например.

Открытие двери — это проход тем-самым-линером по кольцам тетради (не знаю как это называется).

Много звуков соударения кучи ручек\линеров — там почти всё пошло в ход звуков инвентаря.


Мне очень понравился этот Гаминатор. И моё же участие (ну ещё бы!), как случайно наткнулся на визуальный стиль, какие-то бага-фичи, понимание некоторых вещей для себя. А стримы? Очень полезно посмотреть как играют в игру, даже в ультра-забагованную. Короче было круто, как всегда!

Всем спасибо! Особенно тем, кто прочёл до конца.
СЛАВА РОБОТАМ!