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

Тема и концепт

Тема джема – “В отрыве от города”. Надо признать, она звучит скучновато. Сгенерирована она была набирающим популярность OpenAI и он в очередной раз продемонстрировал отсутствие оригинальности. Тема, в общем, скучная. Ее можно обыграть, но по названию темы очень легко понять игры, которые в итоге получатся на джеме. Как и на первый джем, в общем.

Но это особой роли не играет. В таких темах сложнее проявлять творчество, но они дают больше свободы. Можно делать абсолютно что угодно. И рабочих идей у меня было две: симулятор фермы и какой-то сурвайвал в лесу. Да, почти как в первой игре. С водой и картошкой. Если бы ситуация была обычной, я бы стала делать первый вариант (ферму). Но в чатике с джемами нарисовался человек, представившийся художником. Так как рисование артов – большая боль для меня, я подумала что можно попробовать сделать игру в команде.

Уже вместе с Мишей Раевым мы начали брейнштормить на тему. Ему понравилась идея сурвайвала, но я подчеркнула что хочу, чтобы в игре не было никаких монстров (вот так захотелось мне) и что это будет какой-то условный рогалик. Впоследствии я думала как же можно сделать интересный рогалик без монстров и у меня не особо-то получилось. В итоге сурвайвал элементы были выброшены, остались элементы паззла и исследования мира. Постепенно игра обрела очертания и превратилась в гибрид zelda-like адвенчуры и паззла с нарративом, вдохновленным Disco Elysium. Подразумевается, конечно, богатый внутренний мир и самоирония из этой игры, написать гору текста такого качества я пока не могу. На протяжении нескольких дней мое воспаленное воображение никак не могло остановиться и продолжало генерировать идеи до тех пор, пока мне не стало понятно в подробностях как будет выглядеть и играться игра.

Самый ранний прототип
Прототип с первой головоломкой

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

Игровой процесс

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

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

Есть еще один момент. Как вы возможно уже успели понять, я очень люблю головоломки. Поэтому я довольно хорошо в них играю. И я составляла все головоломки в этой игре. Мне казалось, что все паззлы получаются идентичными и скучноватыми. Скорее всего это привело к тому, что уровень сложности игры сильно вырос. Если вы в головоломки не умеете, вам будет тяжело. И в этом кроется подвох. В игру можно потратить столько времени, сколько вам хочется. В ней есть концовка для самых ленивых – достаточно нажать вправо, пропустить последующий диалог и игра завершится в одно действие. При этом я потратила уйму времени на игровой контент, который вполне возможно никто никогда не увидит. А он весьма занимателен, надо сказать. Сейчас, чтобы не спойлерить, я не буду писать что это за контент и понадеюсь, что вы сможете его отыскать самостоятельно. Благо я добавила в игру множество подсказок и намеков на то, где его искать. Но все же игра довольно требовательна. Это не просто развлечение для ваших глаз и пальчиков.

Реализация

Игра сделана на MonoGame + Nez. Я разобралась в них получше, решила использовать встроенный ECS и оно пошло весьма неплохо. Пришлось смириться с тем, что игровой код шебуршит байтами каждый фрейм и греет воздух попусту. Это, видимо, норма в геймдеве. Но по дороге я вляпалась в кучу проблем, ведь я не профессиональный геймдевелопер и не подозреваю где меня ждут проблемы. А ждут они меня повсюду. Начиная от багов в самих MonoGame и Nez и заканчивая просто отсутствием инструментов для некоторых вещей.

Чтобы было понятнее, с чем же возникли проблемы, стоит напомнить, что я чаще всего делаю top-down 2d игры без анимации и подвижных элементов. Давайте взглядем на игру. Игрок толкает бревно, бревно катится. Мы позволяем игроку сразу же идти дальше? Или пускай ждет когда бревно закончит анимацию? Первое – проще. Второе – приятнее. Меня всегда бесит, когда анимация интерфейса мешает мне работать с приложением, поэтому я не могла смириться с таким компромиссом в своей игре. В итоге игра имеет две логики. Жесткую логику объектов и игровой сетки, и мягкую логику анимации. Когда игрок толкает бревно, оно на самом деле сразу телепортируется в свою финальную позицию, падает в реку и делает тайлы ходибельными. Но по анимации это станет видно потом. А теперь представим, что у нас есть кнопка, позволяющая отменить действие. Без нее игра попросту не будет работать, это обязательное условие. Итак, что эта кнопка должна делать? Бревно еще не докатилось, но игрок уже отменяет действия, совершенные после этого. Таким образом, помимо того что есть очередь анимации для каждого объекта (для forward отображения), должна быть еще общая очередь анимаций чтобы их прерывать в правильном порядке (для backward отображения). На этом месте я смирилась с несовершенством своей игры, так что вы легко можете видеть как бревно катится вперед уже после того, как вы отменили действие. Но после того, как оно докатится, оно вернется обратно.

Логика толкания бревна

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

YouTube video

Спидраннерам понравилось бы

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

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

YouTube video

Автогенерация сэкономила огромную кучу времени

Ну и анимированные тайлы в Tiled тоже можно делать, но встроенный инструментарий подразумевает слишком много рутины, поэтому я генерировала tsx с анимациями с помощью самописного Python скрипта. При всем великолепии выбранных инструментов, в них конечно же оказались баги. Например, Nez по какой-то странной причине не хотел работать с продолжительностью анимации, указанной в tsx файле. Поэтому я его пересобрала с захардкоженной продолжительностью. Чтобы не заморачиваться.

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

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

Работа в команде

Игра получилась большой. Когда я все это придумывала, я предполагала, что делать мы ее будем в примерно равных пропорциях. То есть Миша возьмет на себя помимо графики что-то еще. Но, кажется, он сам не ожидал во что вляпался, сколько у него есть свободного времени и какая куча времени уходит на всю эту разработку. Огромная куча. Каждый день на протяжении двух недель я фигачила игру от 10 до 12 часов. Благо, отпуск позволял это делать. Такой коммитмент мало кто может себе позволить и это стоило узнать на берегу. Кроме того, проблемой стала возможность сборки всего добра на чужом железе и у нас так и не вышло это реализовать (частично потому что я использую древнющую версию MonoGame ). В итоге я все собирала у себя. Но на этом подводные камни не кончились. Всю графику, которую рисует другой человек, тоже надо как-то вставлять в игру, а я использую для разработки MonoGame, в котором нет никакого тулсета для этого процесса – все нужно кодить руками. В итоге пришлось писать тонны бойлерплейта, чтобы все работало и выглядело красиво. Код игры занимает больше пяти тысяч строк. И в нем еще не все баги исправлены.

Конечный результат

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

Надо еще сказать, что мне более привычно было бы работать с чистым пиксель-артом. Когда я увидела первые примеры графики, я поняла что референсить Golden Sun придется не только как вдохновительницу паззлов, но и как вдохновительницу графики.

Итоги

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

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

Разработка Spruce Jam хорошо показала на сколь долгое время у меня хватает запала. Не представляю, как соло-разработчики вообще доделывают большие игры в какие-то вменяемые сроки. Длительная разработка одной игры – это невероятно большой труд, требующий серьезной отдачи и большого терпения. Если я в будущем буду сбиваться с кем-то в команду, я постараюсь не расширять свои амбиции так сильно. Сама игра, на мой взгляд, получилась очень хорошей. На такое я могла бы и просто у себя в блоге рецензию накатать. Но на джемы стоит делать что-то другое. Попроще.

P.S. Поиграть во все игры с джема вы можете вот тут
P.P.S. Игра получила первое место по итогам голосования)

Обсуждение в telegram
Метки: ,,