Creepy Support: танец на граблях при создании нелинейной текстовой игры
В программирование меня изначально привело желание делать игры, но как-то так получилось, что за 16 лет карьеры я успел позанимался чем угодно, но не ими. Десктоп, фуллстек-разработка, бэкенд, мобильные приложения, в создания которых я влюбился с головой… Но желание делать игры не пропадало, а просто ждало где-то в сторонке — и спустя столько лет таки дождалось своего часа! Демоверсия уже загружена в Steam, и меня прямо таки распирает от желания рассказать… нет, не о самой игре, а о набитых шишках и о том, как меняется игровой процесс после столкновения с первыми плейтестами.
- Вдохновение
- Идея Creepy Support
- Как писать нелинейную вариативную историю
- Техническая сторона
- Почему MonoGame?
- UI библиотека Myra
- Правки концепта после первых плейтестов
- О написании историй
- Контент: не текстом единым
- Маркетинг
Вдохновение
Всё началось с очередного фестиваля демоверсий в Steam, где я встретил игру Home Safety Hotline. В ней вы берёте на себя роль консультанта на горячей линии, куда обращаются с любыми проблемами в доме: от нашествия муравьев и искрящей проводки до призраков и слизняков-людоедов. И естественно, в разборе всяких паранормальных обращений и был главный смак происходящего.
Увы, геймплей в демке был довольно куцый: игроку поступают обращения в виде аудио-записи с текстовой расшифровкой, тот читает местную вики, сопоставляет в голове факты, делает выводы — и выбирает из справочника, с чем же человеку нужно помочь, с полтергейстом или енотами. Через некоторое время приходит повторный звонок от клиента, по которому становится понятно, верно ли был сделан выбор — и на этом всё. Возможно в полной версии открылись новые грани геймплея, но в демке больше ничего не было.
Идея мне дичайше понравилась, но ограниченность геймплея откровенно огорчала: в реальной жизни почти всегда есть возможность узнать у клиента дополнительные детали, задать наводящие вопросы, чтоб с большей вероятностью узнать, в чём же проблема. И в этом месте я решил, что хочу сделать собственную игру, развив эту идею. Игру я назвал Creepy Support.
Идея Creepy Support
По сюжету мы работаем на горячей линии, но в этот раз уже в гос.организации, которая занимается разбором исключительно паранормальных проблем, эдакий ГосАномальКонтроль. Задаём вопросы, даём пользователю совет по тому, как действовать дальше. Место действия — Россия, потому что написать про другие страны я достоверно вряд ли смогу. Время действия — примерно 2010, так что звонки заменяем обращениями в чате, куда пользователь может присылать также фото и голосовые сообщения.
Каждое обращение — самостоятельная мини-история, текстовый квест, содержание которого пишется с оглядкой на вселенные SCP и игры Control, классические крипи-истории и известные произведения в жанре мистики и ужасов. Без плагиата, но с отсылками, эдакий альманах классических идей из ужастиков. И конечно же должна быть высокая вариативность, не менее 3-5 концовок на каждую историю. Глобальная история со своими концовкам в рамках игры тоже будет, но только как катализатор и повод для происходящего.
В плане интерфейса — никаких текстовых команд и ручного ввода текста, только кнопочки как в текстовых квестах из «Космических Рейнджеров». Идеальная игра для разработчика, который так и не смог научиться рисовать, ведь для такой игры 95% работы — это код и текст тех самых диалогов. Выглядит посильно. Погнали!
Как писать нелинейную вариативную историю
В простейшем варианте нелинейная истории сводится к коллекции пар «вопрос-ответ», а также простейшим условиям появления или исчезновения тех или иных вопросов в зависимости от уже выбранных фраз. Звучит как диалог. Диалоги существуют в играх многие десятилетия, значит удобные инструменты для этой задачки уже наверняка кто-то разработал. Верно?)
В итоге удобного лично для меня решения я не нашёл. Редактор для Twine показался не очень удобным и наглядным, Articy:draft — слишком монструозным. Поэтому в итоге моим редактором историй стал… Obsidian.
Окей, не Obsidian в чистом виде, а его режим Canvas, ручное описание параметров каждого вопроса в ячейках и собственная консолька для конвертирования XML-файла в JSON для моих нужд. Выглядит всё ещё не слишком изящно, но приноровиться реально. Я уже написал в таком формате 8 историй, а также несколько раз возвращался к старым историям после долгого перерыва, и дорабатывать их было не слишком сложно. Окей, с редактором разобрались, время решать, как будем писать остальной код игры.
Техническая сторона
Во вступлении к этому посту я немного слукавил: да, коммерческой разработкой игр я никогда не занимался, но попытки писать собственные игрушки у меня были. И мой единственный полноценный релиз — это пересоздание классических «Цветных Линий» от Gamos на Unity, результат этой работы я выложил в Google Play, а исходники — в опенсорс.
Но сколько всего не увидело свет! Там и видео-квест в лучших традициях Метрона с переходами между локациями в стиле первого Myst, который мы начинали делать с друзьями ещё в школе. И MMO-браузерка про зомби в сеттинге родного Краснотурьинска, простенькие платформеры, пошаговые стратегии, сплитс-скрин шутеры от первого лица… Ничего из этого не добралось до полноценного релиза, всё останавливалось на этапе концепта. Да, порой я выпускал демоверсии, но на этом всё и заканчивалось.
Впрочем, все эти не случившихся релизы (а также много лет работы в коммерческой разработке) научили меня реальнее оценивать и силы и сосредотачивать усилия на важном, изобретая велосипеды только там, где они реально нужны. Поэтому в качестве основы для игры я выбрал игровой движок MonoGame.
MonoGame
Почему MonoGame? Потому что, с одной стороны, на нём написан ряд успешных коммерческих игр, а с другой — у меня есть немало лет опыт работы с C#. Я писал на нём и бэкенд, и консольки, и даже мобильные приложения на Xamarin. И при этом я хотел иметь хотя бы гипотетическую возможность позже собрать свой проект не только для Windows, что Monogame тоже покрывает — среди платформ есть и Linux, и Mac, и игровые консоли.
Раз уже .NET – почему не Unity? Потому что небольшой опыт с Unity у меня тоже был, и для моей задачки этот движок кажется избыточен, если не сказать «монструозен». Monogame же предоставляет даже скорее не движок, а фрейворк для разработки игры, приятно-минималистичный. К тому же, базовая UI-библиотека в Unity несколько лет назад была, с моей точки зрения, несколько глючновата и не очень удобна для использования, если в игре экраны сложнее меню настроек.
Почему не Godot, где тоже есть поддержка C#? По отзывам моих знакомых разработчиков — там C# язык «второго сорта», и писать под этот движок гораздо приятнее на GDScript. Но у меня не было цели «стать профессиональным разработчиком игры на Godot», мне хотелось сосредоточиться на разработке игры, а значит изучать в процессе минимум нового и переиспользовать максимум уже имеющихся скиллов. Впрочем, возможно замечание про «второй сорт» уже неактуально, и если у вас есть такой опыт — пожалуйста, напишите в комментариях, так ли это сейчас?
Ну и напоследок: большую часть последних лет на работе я пишу код на Kotlin под Android, но мне очень хотелось, чтоб процесс написания кода для игры был максимально не похож на написание кода на работе.
UI библиотека Myra
Я перепробовал кучу разных UI-библиотек для Monogame, и в итоге остановился на Myra. Вот примеры скинов из комплекта библиотеки:
Эта библиотека очень проста в использовании, содержит реально все необходимые компоненты, легко кастомизируется и продолжает развиваться. Последнее проверено на собственном опыте, несколько фиксов и микрофич автор от меня принял, за что я ему крайне благодарен. Ну и финальный аккорд — у неё под капотом отличный рендер текста! Когда я перебирал разные библиотеки, то сильно удивился, что банальный скейлинг шрифтов без косяков умеет далеко не каждая либа подобного типа.
Идеальна ли эта библиотека? Нет, но близка к тому) На данный момент мне в ней не хватает только глобальной смены размера шрифта (весь экран приходится пересоздавать) и поддержки геймпадов (или только у меня она не завелось?), но я надеюсь либо самостоятельно это сделать и отправить автору реквест, либо что это доделает кто-то другой, опенсорс же ;)
Правки концепта после первых плейтестов
В итоге после написания первых же трёх тестовых историй я начал тестировать идею на друзьях и близких. По итогу концепт получил немало изменений.
Организация стала аналогом SCP Foundation, т.е. негосударственной секретной организацией. Это позволило закрыть огроменное количество потенциальных сюжетных дыр в сеттинге и логике происходящего.
Выкинул идею с премированием и депремированием игрока по итогам каждой истории. С одной стороны это позволяло создавать довольно специфичную атмосферу и хохмы вида «вы всех спасли, но слишком долго провисели на связе? Получите минус к премии, нас интересует KPI, а не спасённые жизни». С другой стороны — опять же, это вызывало кучу вопрос как сюжетно, так и геймплейно.
Попытки определить, реально аномальное обращение у нас или никакой мистики там нет. Я понял, что у меня просто не хватит сил во вменяемые сроки написать достаточное количество «неаномальных» дел, поэтому они будут встречаться только в порядке исключения.
Рассказ про итоги своего выбора. Изначальной идеей было показывать результат решения игроку сразу, в отдельном канале под рабочим названием «Будущебот». Игрок принял финальное решение в диалоге — особая аномальная технология показала ему, к чему решение приведёт в будущем. Опять же, создавало большие дыры в логике и сеттинге, поэтому теперь формат такой:
- игрок разбирает несколько обращений, после чего заканчивает игровой день
- смотрит анимацию «прошло X дней»
- получает отчёт по всем выполненным делам из предыдущего уровня
Причём в изначальном виде мы ещё и получали в реальном времени комментарий вашего менеджера-куратора на тему сделанного выбора. Теперь такие элементы диалога перекочевали в отдельный разговор с менеджером перед началом нового игрового дня.
Разговоры с менеджером-куратором. В изначальной версии я кидал игрока в гущу событий с порога, без каких-либо объяснений. Теперь же нас встречает наш менеджер-наставник, с которым можно немного поговорить и погрузиться в контекст происходящего. С диалога с ним начинается каждый игровой день.
Лимиты времени. С одной стороны — я просто ТЕРПЕТЬ НЕ МОГУ, когда в играх на меня давит таймер. С другой — хотелось бы добавить игроку некоторого напряжения и необходимости обдумывать каждый шаг. В итоге я сделал лимит на число задаваемых вопросов. Т.е., в истории максимум, скажем, 20 вопросов, но задать можно успеть 14, и волей-неволей придётся каждый раз задумываться — «а хочу ли я задать тот вопрос или этот? Где потенциально полезная информация, а где оффтопик?» Причём в изначальном варианте я прямо писал числом, сколько вопросов осталось, теперь же показываю прогресс-бар, убывающий после каждого заданного вопроса.
Внутренний справочник. Изначально я очень не хотел делать внутриигровой справочник, оставаясь в парадигме «у нас тут пачка текстовых квестов, где все выборы делаются кнопочками». В итоге я его всё же добавил, и этот справочник теперь решает сразу несколько задач:
- рассказать игроку про этот мир, погружать в сеттинг
- давать намёки на то, какой выбор стоит сделать в какой ситуации
- позволяет делать истории, где игроку потребуется выбрать какую-нибудь статью из вики, а не просто ткнуть в пункт диалога с советом
Новостной канал. Изначально я хотел добавить общий чат с другими работниками этой организации, в котором происходила бы своя движуха, но понял, что не вывезу такой объём контента. Заменил эту идею на новостной чат, который будет пополняться хотя бы раз в игровой день, что опять же, позволяет погружать игрока в атмосферу и давать намёки на решения тех или иных квестов.
Поддержка локализации. На старте я думал сделать игру только на русском языке, но меня убедили, что это не очень хорошая идея. Так что теперь игра имеет поддержку локализаций, и демоверсия выпущена на русском и английском языках.
Определился с фокусом игры. Те самые интерактивные истории с детективными элементами, воссоздание ощущения «я всегда хотел закричать в телевизор герою ужастика «не ходи в этот подвал и вызови полицию», а теперь у меня есть такая возможность!» Всё остальное — лишь дополнительные инструменты для погружения и создания атмосферы, приправа, необходимая, но не ключевая.
И на этом расширение и серьёзное изменение концептуальных моментов я закончил. Добавлять фичи в игру можно бесконечно, идей у меня ещё куча, но я хотел бы сосредоточиться на главном и завершить разработку в конце 2025 года...)
О написании историй
Я снял более сотни видео на ютубе, к каждому из которых писал полноценный сценарий, да и опыт написания постов на Хабре и других площадках у меня имеется. В интернете я провёл уже более 20 лет и насмотрелся, как люди общаются в чатах и форумах. Кроме того, формат игры определённо упрощает ситуацию: все рассказы пишутся в виде диалога в мессенджере, простейший диалог вида «вопрос-ответ». Так что написание историй в таком формате должно быть простой задачкой, верно?)
Ну как вам сказать… формат мессенджерского диалога — и благо, и проклятие, потому что ты как автор очень ограничен в выразительных средствах. Ты не можешь описывать мысли героев, их ощущения, давать описания места действия в виде фоновых зарисовок, менять место действия на других персонажей. Да блин, даже фоновых звуков происходящего на фоне у вас нет, если персонаж не пришлёт игроку голосовуху! На первый план выходит сюжет, интересные обстоятельства и умение выдержать стиль именно текстового общения, что оказалось несколько сложнее, чем я ожидал.
Но не смотря на некоторые сложности, тексты историй я пишу от и до сам, без нейросетей, хотя и последние можно неплохо использовать в качестве костыля к воображению. Работает это так: когда я уже написал целиком историю, но мне кажется, что тут ещё чего-то не хватает — я скармливаю сетке краткое описание сюжета и прошу её накидать ещё идей для вопросов или концовок. 99.9(9)% такого вывода отправляется в мусорную корзину, но оставшаяся доля процента может оказаться годной для дальнейшего размышления.
Плюс к созданию игры возможно подключиться мой друг-писатель, и возможно часть будущих историй будет написано им. Ну а пока все тексты идут с пометкой “озвучено написано профессиональным программистом”)
Контент: не текстом единым
Естественно, даже в такой минималистичной игре нужен не только текст, но и графика, музыка и звуки. И если скин для интерфейса я сделал сам с оглядкой на интерфейс Windows 3.1, остальное пришлось добывать другим путём.
Иконки. Мне оооооочень хотелось бы использовать в игре иконки из Windows 95…
… но авторские права никто не отменял, поэтому я пользовался сайтами с иконками, позволяющими бесплатное коммерческое использование, например Flaticon, FreeIcons или Iconfinder. Но не все иконки там доступны для бесплатного коммерческого использования, так что пришлось внимательно проверять лицензию на каждую картинку. Для своего интерфейса я не нашёл готовых классных иконок в пиксельарт-стиле, поэтому подбирал иконки в высоком разрешении, уменьшал их до разрешения 64x64 с помощью neighbors algorithm, после чего доводил до ума вручную в графическом редакторе.
Попытки сгенерировать иконки в нейросетях провалились — ничего пригодного для использования мне выжать из них не удалось. Впрочем, если вы хотите покопать тему создания через “AI” картинок в пиксельарт-стиле — на хабре уже была интересная статья на эту тему.
Звук и музыка. Во-первых, для таких цели есть сайты типа ZapSlat и FreeSound, там ситация как с иконами, есть платные звуки и композиции, есть бесплатные с необходимостью указания автора. Во-вторых — у меня брат дирижёр и музыкант, пара его композиций уже попала в игру, ещё несколькими он сейчас занимается. Ну и в-третьих, в игре подразумевается появления и аудио-записей, которые я местами записывал сам, а местами в будущем попрошу друзей.
Ключевой арт игры, аватарки игровых «клиентов» и фотографии. А вот тут уже не обошлось без нейросетей, благо часть из них (например Kandinsky и ChatGPT) вполне позволяют коммерческие использование результатов их труда. Да, часть фотографий в игре — это реально снятые мною пейзажи, объекты или коллажи, но иллюстраций от «ИИ» в ней тоже немало. Для той же заставочной картинки в начале поста мне понадобилось 50+ итераций и немного фотошопа GIMP’а, но итоговый результат вышел довольно приличным, это вот практически то, что я хотел.
Маркетинг
Перед работой над игрой я хорошенько подготовился: прослушал сотни эпизодов подкастов «Как делают игры», «Пилим трём», «Как питчить игры» и т.п., несколько книжек об авторах хитовых игр, а также книгу о маркетинге игр от Сергея Галёнкина. Поэтому я решил совершить только 90% типичных ошибок в продвижении игры. Ну серьёзно, я пока что определённо не готов искать маркетинговую команду, тратить сотни часов на прокачку аккаунта в тредах реддита или платить за съёмку профессионального трейлера. Тем не менее, некоторые вещи я сделал более-менее верно:
- провёл предварительное тестирование на живых людях и был готов как вносить изменения (вы же не пропустили раздел про изменения после первого прототипа?), так и отвергать прикольные, но слишком уж трудозатраные фичи
- перед началом продвижением игры — создал страницу в Steam, чтоб потенциальные игроки могли уже на этом этапе добавлять её в вишлист
- страницу в Steam оформил по всем канонам — чётко обозначил жанр, сеттинг и настрой в текстах, первые же скриншоты явно дают понятие о геймплее и содержании игры
- написал этот пост ;-)
Если модераторы Хабра потребуют удалить ссылку на игру — я не расстроюсь, потому что мне в любом случае хотелось описать свой опыт по разработке. Надеюсь вы нашли в этой статье для себя что-нибудь интересное, и если у вас остались ещё вопросы об игровой разработке — пишите в комментариях, обязательно отвечу. Или напишу ещё одну статью по вашим вопросам, благо материала ещё осталось немало — чего стоит только цирк с регистрацией аккаунта разработчика в Steam или добавление локализации в архитектуру игры, вообще не готовую к такому повороту событий ;-)