Как сделать игру про сталкера за 3 дня, или LD48
Нет, не про того, который кидает гайки и болты в Зоне, а про человека, который следит за кем-то в социальных сетях, смотрит, кто кому ставит лайки, и на каких еще платформах зарегистрирована цель.
Предыстория
Я уже почти 10 лет участвую в конкурсе Ludum Dare, где нужно сделать игру за 3 дня. О разработке некоторых из них я писал на DTF (3D-тетрис про мебель и ритм-игра про суицидальных хомяков), а одна даже заняла третье место (из 3576!) по инновациям.
В нашей «классической» команде есть выдающийся программист и отличный 3д-моделлер, поэтому мы всегда пытаемся использовать их сильные качества — у нас много красивой графики и необычный геймплей. Но у медали две стороны: выходит так, что делать сюжетно/ролевую/квестовую игру просто невыгодно (хотя мне иногда очень хочется!).
В этот же Ludum Dare звёзды сошлись так, что:
- оба этих человека не смогли участвовать — это значило, что я не мог сделать что-то с необычным геймплеем и использовать много графики
- тема LD48 — Deeper and deeper, и помимо очевидных глубоких океанов и глубокого космоса, ее можно интерпретировать как расследование, в котором игрок зарывается всё глубже и глубже, двигаясь к разгадке
- я удачно впомнил про недостаток игр типа Orwell или Song of Farca (правда, я успел поиграть только в пролог), который меня всегда беспокоил, хотя я и обожаю подобные игры с расследованием социальных взаимодействий: игрок слишком ограничен функционалом самой игры — все кнопки/имена подсвечены, и понятно, что их нужно нажать
В результате, появилась идея сделать игру, где база данных из Orwell совмещалась бы с реальными соцсетями так, чтобы часть полезной информации была в игре, а часть — где-нибудь в Фейсбуке или Твиттере. Да, все посты на этих страничках были бы сделаны в один и тот же день, но это можно считать игровой условностью; к тому же можно не тратить время на реализацию функционала соцсетей — достаточно воспользоваться уже существующим! Я предложил эту идею девушке (Оксана) и другу-геймдизайнеру (Антон), которые согласились мне помочь, побрейнштормил в одиночку и с чистой совестью ушел спать (всё-таки, тема LD объявляется в 3 часа ночи).
Начальное планирование
Перед тем, как придумывать и обсуждать сюжет с командой, я решил подумать про мои любимые тропы в подобных историях. Я выписал их в один список вместе с набросками идей и потом объяснил их ребятам. Выглядит это, конечно, совершенно нечитабельно, но помогло обозначить границы истории и общее видение, от которого уже можно оттолкнуться. Да и использовал я этот список как заметки «для себя», когда рассказывал результаты своего соло-штурма.
После этого начался уже общий брейншторм — мы решили выписать максимальное количество возможных «внешних» источников данных, начиная от фейсбука и заканчивая Mastodon.
В итоге, мы определились с первоначальными задачами (я начинаю думать над технической реализацией, Оксана ищет звуки, Антон пишет глобальный сюжет) и определили все последующие таким образом, чтобы не блокировать друг друга, а работать независимо как можно дольше, и только ближе к концу разработки использовать наработки коллег. Получилось, кстати, отлично — к моменту, когда был готов общий сценарий, звуки тоже были найдены, и можно было приступать к написанию уже конкретных текстов (но про это будет подробнее в разделе про сюжет!).
Графика
Как только я начал думать над технической реализацией, сразу возник вопрос — какую нам использовать графику? Рисовать хорошо никто из нас не умеет, а использовать фотографии реальных людей «как есть» — не самая хорошая идея, это и некрасиво (кому понравится увидеть себя в качестве преступника), и ломает визуальный стиль игры (слишком тяжело будет найти изображения, снятые в одном стиле). Но тут я удачно вспомнил, что работал Computer Vision программистом, и решил просто написать скрипт, который бы из фотографий делал стилизованные изображения.
Процесс превращения фотографии в изображения после долгих (нет) экспериментов был выбран такой — сначала с помощью K-means алгоритма я сокращал количество цветов на фотографии до 4, потом накидывал блюра, и в конце «пикселизовывал» изображение. Большой плюс всего этого был в том, что можно было найти сразу все фотографии, которые были нужны, и просто запустить код один раз. Кстати, некоторые тестовые изображения, которые не вошли в игру, получились достаточно красивыми!
Теперь можно переходить к совсем уж технической части.
Программирование / UI
Все предыдущие игры мы делали на Unity — хотя программировал я там совсем мало, но с этим движком я знаком гораздо лучше, чем с любым другим. Правда, испортили идею использовать проверенную программу два момента: во-первых, оказалось, что на новом компьютере не скачан Unity, а во-вторых — скорость интернета у меня была просто ужасная. С грустью увидев сообщение «до окончания скачивания осталось 2 дня», я решил попробовать новый для меня, и (что было гораздо более важно) супермаленький Godot.
Было очень больно и непривычно. Во-первых, коммьюнити Godot показалось гораздо меньшим, чем у Unity — найти решение в случае непонятных моментов оказалось сильно сложнее, документация мне тоже не понравилась. Во-вторых, всё слишком непривычно — немного другой язык программирования, другие правила построения сцен и так далее. Мне очень повезло, что вся игра, по факту, это большое меню (была даже идея сделать ее в вебе, но как-то не взлетела), потому что есть ощущение, что я бы не осилил написать что-то полноценное.
Но чем больше меню, тем больше ответственность (за UI): в нем игроки проведут большую часть времени игры. Сначала я придумал основные части, которые я бы хотел иметь на странице: поисковая строка, информация о профиле, чат с наставником и полоска с обозначением «как глубоко в расследовании ты ушел» (как можно будет заметить, полоска эта ушла в небытие). Первый драфт, даже с подсмотренными палитрами цветов, оказался достаточно убогим, но помог определиться, какие объекты нужны, и где примерно они будут находиться:
К этому моменту, Оксана уже успела закончить с поиском звуков, и по моему драфту набросала что-то более похожее на нормальный и красивый интерфейс (я в это время пытался понять, как заставить кнопки работать).
Внезапно, произошло чудо, и художник из команды, с которой мы работали над прошлыми играми LD, оказался ненадолго свободен. Благодаря нему UI драфт превратился просто в конфетку.
После этого осталось всего лишь (хаха!) перенести этот UI в Godot. В итоге, получилось что-то такое (небольшие спойлеры, профиль из обучения).
Таким образом, несмотря на всё мое недовольство Godot, несмотря на то, что весь код был написан в одном огромном файле, несмотря на то, что для каждого чата и профиля пришлось делать отдельное окошко (я не успевал разобраться в нормальных конструкторах), с технической частью удалось управиться за необходимые 3 дня, йей!
Сюжет
Всё-таки, самое главное в подобных играх — это сюжет и история. Мы решили сделать несколько небольших дел, которые складываются в большую историю (обожаю этот момент из L.A. Noire, в главе про отдел поджогов!), и Антон приступил к делу. Сначала он расписал каждое дело в виде обычного текста (на примере первого дела):
После этого мы построили схемы (некоторые, попроще, некоторые посложнее) в draw.io, что-где-когда происходит: что написано в базе данных, что говорит супервайзер, и куда переходить за новой информацией. Однако, всё еще не тем текстом, который будет написан в игре, а общим (например, «супервайзер удивляется интеллекту игрока»). В скриншоте далее уже могут быть спойлеры, если планируете играть, не читайте его!
После того, как подробный план истории был сделан, необходимо было написать текст профилей, который будет в базе данных, диалоги между игроком и супервайзером, а также заполнить все соцсети. Оксана и Антон распределили между собой профили и диалоги…
…а также заполнили большую часть социальных профилей (это, прямо скажем, была титаническая работа).
В итоге, для истории было создано (надеюсь, сам факт существования этих акков — не спойлер: D):
- несколько аккаунтов на фейсбуке
- несколько аккаунтов на гитхабе
- аккаунт в твиттере
- записано видео
- LinkedIn аккаунт
- сервер в дискорде
- фейковые чаты из телеграма
Музыка и звуки
Звуки, как обычно, мы искали на freesound, их получилось не очень много, но случилась интересная история, из-за которой я решил посвятить им отдельный раздел. Помимо звуков, отмеченных в ТЗ, Оксана нашла еще один звук, подписав его вот так:
Этот бум мне настолько понравился, что из-за него пришлось не только немного поменять сюжет и диалоги, но и добавить специальный функционал в код самой игры: и этот функционал не используется нигде, кроме этого бума! Но то, что получилось в итоге, мне очень понравилось, получился прямо настоящий саунд-дизайн.
Вывод
В конце концов, мы успели сделать всё, что хотели, еще до окончания LD: обычно мы в поту допиливаем всё в последние часы, здесь же получилось выложить игру часа за 4 до окончания времени. Большинство комментариев на странице были очень положительные — люди хвалили атмосферу и идею, более того, из-за того, что в дискорде видно, кто зашел на сервер, было понятно, кто из комментаторов прошел игру почти до конца. Единственный большой минус, который люди отмечали — это необходимость иметь фейсбук, без него невозможно пройти дальше начала игры (хотя никто не мешает зарегать фейк, кстати!).
Имея такие замечательные комментарии, и (что редкость для меня) кайфуя от самой игры, я ждал окончания конкурса. С одной стороны, с другой командой мы чаще всего входили в топ 100 и получали отличные отзывы. С другой стороны, это была моя первая игра в качестве «полноценного» программиста, поэтому я не ждал совсем уж высоких оценок, но надеялся на хороший результат в «инновациях». В итоге, полученный результат меня просто сломал, такого плохого приема я даже не ожидал (особенно, с учетом топовых комментариев):
Но советую вам поиграть самим! Специально для этой статьи Антон перевел игру на русский (социалки так и остались на английском, но там и браузер сможет перевести), скачать игру можно здесь.
В конце концв, мы получили офигенный опыт, да и кучу вещей делали в первый раз, так что оценки тут — не главное. Спасибо большое Антону и Оксане за отличную командную работу, Глебу за красивый UI, и Зине за тесты и вычитку.