Как мы разрабатывали мобильную игру (short version)

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

Без лишнего бэка. Только Hard Work.

Family Curse: the Prologue

Пара скринов для затравки и летс гоу

Как мы разрабатывали мобильную игру (short version)
Как мы разрабатывали мобильную игру (short version)

В 2020 году, мы компанией из 4 друзей решили создать мобильную игру. Почему мобильную? Я уже давно занимался на тот момент мобильной разработкой и выкатил на рынок несколько успешных тестов и приложение для оценки здоровья, а так же уже имел в загажнике готовый самописный 2D-движок для мобильных игр.

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

На начальном этапе Я, Миха и Макс определились с концепцией, которая будет интересна всем, распределить обязанности и за 2-3 месяца наметили выкатить технодемку, которую можно будет показать в качестве демонстрации возможностей студии и собрать денег на реализацию полного видения истории.

Чуть-чуть поразмышляв над концептом игры, мы решили сделать приключение с Лафкрафтианскими вайбами, готической стилистикой, и слегка переосмысленной Шумерской мифологией, где героиня будет молодой девушкой, место действия - особняком 20 века, а сам геймплей в демо-версии подогнанным под мобильные особенности point and click квестом с несколькими головоломками в наличии. Немного сумбурно, но нормально, чтобы показать, как студия может работать с разными тех. задачами и объединять концепции в единое решение. Кроме того, мы сразу пришли к виденью, что в нашем проекте обязательно должна быть озвучка, которая будет некой фишкой на фоне аналогов.

Я, так как уже имел опыт работы с двумерным движком после выпуска Межзвездной Кисы (нищего клона flappy bird), должен был программировать ядро. А Макс, тоже имевший опыт в Java - помогать мне с логикой.

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

На тот момент времени мы хотели развивать вселенную Керса и после выпуска демки, поэтому мы с Максом разделили нарративные задачи следующим образом: я был ответственен за общий лор и концепты вселенной игры, а Макс за сюжет, диалоговую составляющую конкретно истории Эмили в техно-демо и перевод проекта на английский язык.

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

Весь дом существует в виде реальной 3D-сцены, которую при желании можно импортировать в Анрил и походить внутри. То, что вы видите в игре - это рендер по сечению.
Весь дом существует в виде реальной 3D-сцены, которую при желании можно импортировать в Анрил и походить внутри. То, что вы видите в игре - это рендер по сечению.

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

Как мы разрабатывали мобильную игру (short version)

Марию Безрукову мы также подключили на самом раннем этапе разработки. Она озвучила главную героиню, уже получившую имя Эмили. А также с первого раза попала в настроение игры, написав 3 атмосферных трека, и стилизовав музыку из своей авторской песни "НЛО" под старинную граммофонную пластинку. Думаю, Маша не обидится, если я выложу главную музыкальную тему игры здесь, а остальные она опубликует сама, если захочет.

Также Маша нашла нам часть актеров на озвучку других персонажей, среди которых есть тот самый Стас Саксон с Донатион Алертс (брат Оляши).

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

Как мы разрабатывали мобильную игру (short version)

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

Keepers's Curse: the Prologue

После таймскипа, в 4 года, обусловленного чередой личных невзгод и потрясений. Мы с Михой приступили к ребилду проекта под другим названием. В этом абзаце только добавлю, что у меня была двоюродная младшая сестра Маша, у которой была мечта озвучивать аниме, поэтому мы с Михой взяли ее на пару реплик в игру. Могли бы и на большее количество, но из-за ВСЖ-moments в 2022 году ее не стало, по этой и неким другим причинам, описанным в большой статье этот проект имел для меня важное личное значение.

На раннем этапе ребилда Миха перерисовал главную героиню. Первая версия была мультяшной и не очень вписывалась в более реалистичную стилистику сцены.

Зато желтое платье в первой ревизии игры намекает на беды с башкой у героини.
Зато желтое платье в первой ревизии игры намекает на беды с башкой у героини.

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

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

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

Весь дом расположен на одном общем рендере house.png, а программно, каждая комната - это отдельный двумерный массив RoomArray с объектами типа Room.

Активная комната выбирается из массива после полного прохождения свайпа. В каждой комнате есть свои активные объекты, свои головоломки или места, завязанные на применение предметов из инвентаря. Чтобы снизить общую нагрузку на процессор, функции, которые выполняются или проверяются в общем большом потоке update не висят в Треде все подряд, а берутся в исполнение только те, которые привязаны к конкретной комнате. А вот снизить нагрузку на оперативку не получилось, потому что Java не любит широкоформатные изображение. 600 MB оперативки, которое приложение хавает - не из-за кривой логики, а из-за хайрезных Bitmap-ов и методов их обработки Рендером джавы, постараюсь потом снизить потребление хотя бы до 400 мегабайт.

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

Программируя мини-игры, я хотел добавить хотя бы небольшой элемент реиграбельности. А также сделать сами головоломки настолько user-friendly, насколько возможно.

И если пятнашки зарандомайзить довольно легко. Да-да, shuffle лежит в открытом доступе на хабре. То для удобства пользователя я реализовал фичу, которая позволяет одновременно сдвигать не только по одной, но и стак из двух или трех квадратиков. Для этого мне удачно послужила такая внутренняя функция Java, как перегрузка методов. Практического профита, наверное, в этом не так много, но есть какое-то эстетическое наслаждение, когда вместе трех функций GoLeft1, GoLeft2, GoLeft3 у тебя 3 метода с именем GoLeft.

Ассеты головоломок, каждый элемент имеет свои свойства и координаты X, Y на предназначенном холсте в коде
Ассеты головоломок, каждый элемент имеет свои свойства и координаты X, Y на предназначенном холсте в коде

Еще один, полузабавный и не душный момент связан с мини-игрой "Взлом Замка" и локализацией. Дело в том, что я решил зарандомайзить 3 скорости бегунков дробными переменными 1.1, 1.2 и 1.3. Тестируя мини-игру на телефонах с языком по умолчанию, отличным от русского и английского, я столкнулся с рандомными вылетами на этой головоломке. Все дело оказалось в том, что в некоторых странах рандом генерирует дробное число не с точкой, а запятой, что компилятор Java не хавает. Решение было таким:

DecimalFormatSymbols типа Locale.US приводит любую генерацию дробного числа под правильно интерпретируемый стандарт дробного числа с точкой.
DecimalFormatSymbols типа Locale.US приводит любую генерацию дробного числа под правильно интерпретируемый стандарт дробного числа с точкой.

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

А еще все предметы для инвентаря - это тоже рендер изначальных 3D-моделей. Никаких нейросеток тогда не было
А еще все предметы для инвентаря - это тоже рендер изначальных 3D-моделей. Никаких нейросеток тогда не было

Если будет запрос, я вообще могу выложить весь код и каждый момент подробнее рассказывать в своей статье. LockPick Mini-Game вообще получился на редкость удачным (а это значит, что код короткий и эффективный), так что можете потом брать полные его исходники и пользоваться в своем мобильном Обливионе.

В целом, мне есть, чем гордиться по итогам сборки данного проекта. Написан он на чистой джаве и даже метод сохранения предметов инвентаря реализован без использования Gson/Json.

Но вообще, ребятки. Поймите тоже одну вещь, можно шутить сколько угодно про заимствования кода из открытых источников и т.д., но 80% его реально писаны с нуля и многое я открывал для себя и реализовывал в первый раз и не в самом хорошем ментально-моральном состоянии. Поэтому, кто умненький, порешайте пятнашки в ручную, не скипайте по кнопке. Один человек сказал, что у него был вылет. Все со временем попатчим. А так же в игре работает авто-сохранение после решения каждой головоломки или активации сюжетного предмета, СПОЙЛЕР:

последний сейв срабатывает на чердаке после появления маски на полу.

С SharedPrefs я тоже раньше не работал, поэтому кого не напрягает, посейвскамьте плз.

О всех результатах и найденных багах можете писать или в личку вк

или на почту студии [email protected]

ВЫВОДЫ

Какие мы можем сделать выводы по итогам статьи?

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

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

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

И даже если в моей частной истории придет ужасный конец на место ужаса без конца, я буду честен перед самим собой в том, что чмом позорным не стал. Любите своих младших сестер и братьев и цените время, проведенное с близкими. Если статья не повод обнять-приподнять, то хотя бы позвоните и узнайте как дела.

Воспринимайте игру, как технодемку, как она и задумывалась. Я все ее минусы прекрасно понимаю. Шаблонные диалоги с тавтологиями, не все из которых писал я, но я их качество вовремя не проконтролировал. Тривиальные головоломки. Кривая концовка без подводки. НО СПОЙЛЕР:

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

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

СЛОВА БЛАГОДАРНОСТИ

Спасибо Михе за крутые локации, персонажей, весь-весь дизайн, а так же за правки на ребилде проекта в 2024 году. Кроме того за часть сайнд-дизайна и сведение уровней звука в репликах. Ну и самое главное спасибо за то, что не дал "друзьям" угнать проект и моральную поддержку в эти 4 адских года. Надеюсь, что будет все-таки получше.

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

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

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

САМА ИГРА

Ну а пока гугл обрабатыват патч первого дня, вот вам ссылка на саму игру Keepers's Curse: the Prologue. Буду рад оценке и развернутым комментариям. Ваши звезды очень помогают мобильным разработчикам. Ставьте столько, сколько игра по Вашему мнению заслуживает.

Для поддержки:

ТИНЬКОФФ: 5536 9139 2085 6131 Василий

АЛЬФА: 2200 1523 7817 0636 Василий

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

ПРИ ПЕРЕВОДЕ НА КАРТУ ПИШИТЕ ПОМЕТКУ "ЭМИЛИ", ЧТОБЫ Я НЕ СКРЫСИЛ СЕБЕ ВСЕ БАБКИ, А ДЕЛИЛ НА ВСЕХ

11