- PVSM.RU - https://www.pvsm.ru -
В программирование меня изначально привело желание делать игры, но как-то так получилось, что за 16 лет карьеры я успел позанимался чем угодно, но не ими. Десктоп, фуллстек-разработка, бэкенд, мобильные приложения, в создания которых я влюбился с головой… Но желание делать игры не пропадало, а просто ждало где-то в сторонке — и спустя столько лет таки дождалось своего часа! Демоверсия уже загружена в Steam, и меня прямо таки распирает от желания рассказать… нет, не о самой игре, а о набитых шишках и о том, как меняется игровой процесс после столкновения с первыми плейтестами.

Всё началось с очередного фестиваля демоверсий в Steam, где я встретил игру Home Safety Hotline. В ней вы берёте на себя роль консультанта на горячей линии, куда обращаются с любыми проблемами в доме: от нашествия муравьев и искрящей проводки до призраков и слизняков-людоедов. И естественно, в разборе всяких паранормальных обращений и был главный смак происходящего.

Увы, геймплей в демке был довольно куцый: игроку поступают обращения в виде аудио-записи с текстовой расшифровкой, тот читает местную вики, сопоставляет в голове факты, делает выводы — и выбирает из справочника, с чем же человеку нужно помочь, с полтергейстом или енотами. Через некоторое время приходит повторный звонок от клиента, по которому становится понятно, верно ли был сделан выбор — и на этом всё. Возможно в полной версии открылись новые грани геймплея, но в демке больше ничего не было.
Идея мне дичайше понравилась, но ограниченность геймплея откровенно огорчала: в реальной жизни почти всегда есть возможность узнать у клиента дополнительные детали, задать наводящие вопросы, чтоб с большей вероятностью узнать, в чём же проблема. И в этом месте я решил, что хочу сделать собственную игру, развив эту идею. Игру я назвал Creepy Support.
По сюжету мы работаем на горячей линии, но в этот раз уже в гос.организации, которая занимается разбором исключительно паранормальных проблем, эдакий ГосАномальКонтроль. Задаём вопросы, даём пользователю совет по тому, как действовать дальше. Место действия — Россия, потому что написать про другие страны я достоверно вряд ли смогу. Время действия — примерно 2010, так что звонки заменяем обращениями в чате, куда пользователь может присылать также фото и голосовые сообщения.
Каждое обращение — самостоятельная мини-история, текстовый квест, содержание которого пишется с оглядкой на вселенные SCP и игры Control, классические крипи-истории и известные произведения в жанре мистики и ужасов. Без плагиата, но с отсылками, эдакий альманах классических идей из ужастиков. И конечно же должна быть высокая вариативность, не менее 3-5 концовок на каждую историю. Глобальная история со своими концовкам в рамках игры тоже будет, но только как катализатор и повод для происходящего.
В плане интерфейса — никаких текстовых команд и ручного ввода текста, только кнопочки как в текстовых квестах из «Космических Рейнджеров». Идеальная игра для разработчика, который так и не смог научиться рисовать, ведь для такой игры 95% работы — это код и текст тех самых диалогов. Выглядит посильно. Погнали!

В простейшем варианте нелинейная истории сводится к коллекции пар «вопрос-ответ», а также простейшим условиям появления или исчезновения тех или иных вопросов в зависимости от уже выбранных фраз. Звучит как диалог. Диалоги существуют в играх многие десятилетия, значит удобные инструменты для этой задачки уже наверняка кто-то разработал. Верно?)

В итоге удобного лично для меня решения я не нашёл. Редактор для Twine [11] показался не очень удобным и наглядным, Articy:draft [12] — слишком монструозным. Поэтому в итоге моим редактором историй стал… Obsidian [13].


Окей, не Obsidian в чистом виде, а его режим Canvas, ручное описание параметров каждого вопроса в ячейках и собственная консолька для конвертирования XML-файла в JSON для моих нужд. Выглядит всё ещё не слишком изящно, но приноровиться реально. Я уже написал в таком формате 8 историй, а также несколько раз возвращался к старым историям после долгого перерыва, и дорабатывать их было не слишком сложно. Окей, с редактором разобрались, время решать, как будем писать остальной код игры.
Во вступлении к этому посту я немного слукавил: да, коммерческой разработкой игр я никогда не занимался, но попытки писать собственные игрушки у меня были. И мой единственный полноценный релиз — это пересоздание классических «Цветных Линий» от Gamos на Unity, результат этой работы я выложил в Google Play, а исходники — в опенсорс [14].

Но сколько всего не увидело свет! Там и видео-квест в лучших традициях Метрона с переходами между локациями в стиле первого Myst, который мы начинали делать с друзьями ещё в школе. И MMO-браузерка про зомби в сеттинге родного Краснотурьинска, простенькие платформеры, пошаговые стратегии, сплитс-скрин шутеры от первого лица… Ничего из этого не добралось до полноценного релиза, всё останавливалось на этапе концепта. Да, порой я выпускал демоверсии, но на этом всё и заканчивалось.

Впрочем, все эти не случившихся релизы (а также много лет работы в коммерческой разработке) научили меня реальнее оценивать и силы и сосредотачивать усилия на важном, изобретая велосипеды только там, где они реально нужны. Поэтому в качестве основы для игры я выбрал игровой движок MonoGame.
Почему MonoGame [15]? Потому что, с одной стороны, на нём написан ряд успешных коммерческих игр, а с другой — у меня есть немало лет опыт работы с C#. Я писал на нём и бэкенд, и консольки, и даже мобильные приложения на Xamarin. И при этом я хотел иметь хотя бы гипотетическую возможность позже собрать свой проект не только для Windows, что Monogame тоже покрывает — среди платформ есть и Linux, и Mac, и игровые консоли.
Раз уже .NET – почему не Unity [16]? Потому что небольшой опыт с Unity у меня тоже был, и для моей задачки этот движок кажется избыточен, если не сказать «монструозен». Monogame же предоставляет даже скорее не движок, а фрейворк для разработки игры, приятно-минималистичный. К тому же, базовая UI-библиотека в Unity несколько лет назад была, с моей точки зрения, несколько глючновата и не очень удобна для использования, если в игре экраны сложнее меню настроек.
Почему не Godot [17], где тоже есть поддержка C#? По отзывам моих знакомых разработчиков — там C# язык «второго сорта», и писать под этот движок гораздо приятнее на GDScript. Но у меня не было цели «стать профессиональным разработчиком игры на Godot», мне хотелось сосредоточиться на разработке игры, а значит изучать в процессе минимум нового и переиспользовать максимум уже имеющихся скиллов. Впрочем, возможно замечание про «второй сорт» уже неактуально, и если у вас есть такой опыт — пожалуйста, напишите в комментариях, так ли это сейчас?
Ну и напоследок: большую часть последних лет на работе я пишу код на Kotlin под Android, но мне очень хотелось, чтоб процесс написания кода для игры был максимально не похож на написание кода на работе.
Я перепробовал кучу разных UI-библиотек для Monogame, и в итоге остановился на Myra [18]. Вот примеры скинов из комплекта библиотеки:

Эта библиотека очень проста в использовании, содержит реально все необходимые компоненты, легко кастомизируется и продолжает развиваться. Последнее проверено на собственном опыте [19], несколько фиксов и микрофич автор от меня принял, за что я ему крайне благодарен. Ну и финальный аккорд — у неё под капотом отличный рендер текста! Когда я перебирал разные библиотеки, то сильно удивился, что банальный скейлинг шрифтов без косяков умеет далеко не каждая либа подобного типа.
Идеальна ли эта библиотека? Нет, но близка к тому) На данный момент мне в ней не хватает только глобальной смены размера шрифта (весь экран приходится пересоздавать) и поддержки геймпадов (или только у меня она не завелось?), но я надеюсь либо самостоятельно это сделать и отправить автору реквест, либо что это доделает кто-то другой, опенсорс же ;)
В итоге после написания первых же трёх тестовых историй я начал тестировать идею на друзьях и близких. По итогу концепт получил немало изменений.
Организация стала аналогом SCP Foundation, т.е. негосударственной секретной организацией. Это позволило закрыть огроменное количество потенциальных сюжетных дыр в сеттинге и логике происходящего.
Выкинул идею с премированием и депремированием игрока по итогам каждой истории. С одной стороны это позволяло создавать довольно специфичную атмосферу и хохмы вида «вы всех спасли, но слишком долго провисели на связе? Получите минус к премии, нас интересует KPI, а не спасённые жизни». С другой стороны — опять же, это вызывало кучу вопрос как сюжетно, так и геймплейно.
Попытки определить, реально аномальное обращение у нас или никакой мистики там нет. Я понял, что у меня просто не хватит сил во вменяемые сроки написать достаточное количество «неаномальных» дел, поэтому они будут встречаться только в порядке исключения.
Рассказ про итоги своего выбора. Изначальной идеей было показывать результат решения игроку сразу, в отдельном канале под рабочим названием «Будущебот». Игрок принял финальное решение в диалоге — особая аномальная технология показала ему, к чему решение приведёт в будущем. Опять же, создавало большие дыры в логике и сеттинге, поэтому теперь формат такой:
Причём в изначальном виде мы ещё и получали в реальном времени комментарий вашего менеджера-куратора на тему сделанного выбора. Теперь такие элементы диалога перекочевали в отдельный разговор с менеджером перед началом нового игрового дня.
Разговоры с менеджером-куратором. В изначальной версии я кидал игрока в гущу событий с порога, без каких-либо объяснений. Теперь же нас встречает наш менеджер-наставник, с которым можно немного поговорить и погрузиться в контекст происходящего. С диалога с ним начинается каждый игровой день.
Лимиты времени. С одной стороны — я просто ТЕРПЕТЬ НЕ МОГУ, когда в играх на меня давит таймер. С другой — хотелось бы добавить игроку некоторого напряжения и необходимости обдумывать каждый шаг. В итоге я сделал лимит на число задаваемых вопросов. Т.е., в истории максимум, скажем, 20 вопросов, но задать можно успеть 14, и волей-неволей придётся каждый раз задумываться — «а хочу ли я задать тот вопрос или этот? Где потенциально полезная информация, а где оффтопик?» Причём в изначальном варианте я прямо писал числом, сколько вопросов осталось, теперь же показываю прогресс-бар, убывающий после каждого заданного вопроса.
Внутренний справочник. Изначально я очень не хотел делать внутриигровой справочник, оставаясь в парадигме «у нас тут пачка текстовых квестов, где все выборы делаются кнопочками». В итоге я его всё же добавил, и этот справочник теперь решает сразу несколько задач:

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

Поддержка локализации. На старте я думал сделать игру только на русском языке, но меня убедили, что это не очень хорошая идея. Так что теперь игра имеет поддержку локализаций, и демоверсия выпущена на русском и английском языках.
Определился с фокусом игры. Те самые интерактивные истории с детективными элементами, воссоздание ощущения «я всегда хотел закричать в телевизор герою ужастика «не ходи в этот подвал и вызови полицию», а теперь у меня есть такая возможность!» Всё остальное — лишь дополнительные инструменты для погружения и создания атмосферы, приправа, необходимая, но не ключевая.
И на этом расширение и серьёзное изменение концептуальных моментов я закончил. Добавлять фичи в игру можно бесконечно, идей у меня ещё куча, но я хотел бы сосредоточиться на главном и завершить разработку в конце 2025 года...)
Я снял более сотни видео на ютубе, к каждому из которых писал полноценный сценарий, да и опыт написания постов на Хабре и других площадках у меня имеется. В интернете я провёл уже более 20 лет и насмотрелся, как люди общаются в чатах и форумах. Кроме того, формат игры определённо упрощает ситуацию: все рассказы пишутся в виде диалога в мессенджере, простейший диалог вида «вопрос-ответ». Так что написание историй в таком формате должно быть простой задачкой, верно?)
Ну как вам сказать… формат мессенджерского диалога — и благо, и проклятие, потому что ты как автор очень ограничен в выразительных средствах. Ты не можешь описывать мысли героев, их ощущения, давать описания места действия в виде фоновых зарисовок, менять место действия на других персонажей. Да блин, даже фоновых звуков происходящего на фоне у вас нет, если персонаж не пришлёт игроку голосовуху! На первый план выходит сюжет, интересные обстоятельства и умение выдержать стиль именно текстового общения, что оказалось несколько сложнее, чем я ожидал.
Но не смотря на некоторые сложности, тексты историй я пишу от и до сам, без нейросетей, хотя и последние можно неплохо использовать в качестве костыля к воображению. Работает это так: когда я уже написал целиком историю, но мне кажется, что тут ещё чего-то не хватает — я скармливаю сетке краткое описание сюжета и прошу её накидать ещё идей для вопросов или концовок. 99.9(9)% такого вывода отправляется в мусорную корзину, но оставшаяся доля процента может оказаться годной для дальнейшего размышления.
Плюс к созданию игры возможно подключиться мой друг-писатель, и возможно часть будущих историй будет написано им. Ну а пока все тексты идут с пометкой “озвучено написано профессиональным программистом”)
Естественно, даже в такой минималистичной игре нужен не только текст, но и графика, музыка и звуки. И если скин для интерфейса я сделал сам с оглядкой на интерфейс Windows 3.1, остальное пришлось добывать другим путём.
Иконки. Мне оооооочень хотелось бы использовать в игре иконки из Windows 95…

… но авторские права никто не отменял, поэтому я пользовался сайтами с иконками, позволяющими бесплатное коммерческое использование, например Flaticon [20], FreeIcons [21] или Iconfinder [22]. Но не все иконки там доступны для бесплатного коммерческого использования, так что пришлось внимательно проверять лицензию на каждую картинку. Для своего интерфейса я не нашёл готовых классных иконок в пиксельарт-стиле, поэтому подбирал иконки в высоком разрешении, уменьшал их до разрешения 64x64 с помощью neighbors algorithm, после чего доводил до ума вручную в графическом редакторе.

Попытки сгенерировать иконки в нейросетях провалились — ничего пригодного для использования мне выжать из них не удалось. Впрочем, если вы хотите покопать тему создания через “AI” картинок в пиксельарт-стиле — на хабре уже была интересная статья на эту тему [23].
Звук и музыка. Во-первых, для таких цели есть сайты типа ZapSlat [24] и FreeSound [25], там ситация как с иконами, есть платные звуки и композиции, есть бесплатные с необходимостью указания автора. Во-вторых — у меня брат дирижёр и музыкант, пара его композиций уже попала в игру, ещё несколькими он сейчас занимается. Ну и в-третьих, в игре подразумевается появления и аудио-записей, которые я местами записывал сам, а местами в будущем попрошу друзей.
Ключевой арт игры, аватарки игровых «клиентов» и фотографии. А вот тут уже не обошлось без нейросетей, благо часть из них (например Kandinsky и ChatGPT) вполне позволяют коммерческие использование результатов их труда. Да, часть фотографий в игре — это реально снятые мною пейзажи, объекты или коллажи, но иллюстраций от «ИИ» в ней тоже немало. Для той же заставочной картинки в начале поста мне понадобилось 50+ итераций и немного фотошопа GIMP’а, но итоговый результат вышел довольно приличным, это вот практически то, что я хотел.
Перед работой над игрой я хорошенько подготовился: прослушал сотни эпизодов подкастов «Как делают игры», «Пилим трём», «Как питчить игры» и т.п., несколько книжек об авторах хитовых игр, а также книгу о маркетинге игр [26] от Сергея Галёнкина. Поэтому я решил совершить только 90% типичных ошибок в продвижении игры. Ну серьёзно, я пока что определённо не готов искать маркетинговую команду, тратить сотни часов на прокачку аккаунта в тредах реддита или платить за съёмку профессионального трейлера. Тем не менее, некоторые вещи я сделал более-менее верно:
Если модераторы Хабра потребуют удалить ссылку на игру [27] — я не расстроюсь, потому что мне в любом случае хотелось описать свой опыт по разработке. Надеюсь вы нашли в этой статье для себя что-нибудь интересное, и если у вас остались ещё вопросы об игровой разработке — пишите в комментариях, обязательно отвечу. Или напишу ещё одну статью по вашим вопросам, благо материала ещё осталось немало — чего стоит только цирк с регистрацией аккаунта разработчика в Steam или добавление локализации в архитектуру игры, вообще не готовую к такому повороту событий ;-)
Автор: Newbilius
Источник [28]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/420780
Ссылки в тексте:
[1] Вдохновение: #intro
[2] Идея Creepy Support: #idea
[3] Как писать нелинейную вариативную историю: #editor
[4] Техническая сторона: #tech
[5] Почему MonoGame?: #monogame
[6] UI библиотека Myra: #myra
[7] Правки концепта после первых плейтестов: #changes
[8] О написании историй: #stories
[9] Контент: не текстом единым: #content
[10] Маркетинг: #marketing
[11] Twine: https://twinery.org/
[12] Articy:draft: https://www.articy.com/en/
[13] Obsidian: https://obsidian.md/
[14] в опенсорс: https://github.com/Newbilius/ColorLinesUnity
[15] MonoGame: https://monogame.net/
[16] Unity: https://unity.com/ru
[17] Godot: https://godotengine.org/
[18] Myra: https://github.com/rds1983/Myra
[19] на собственном опыте: https://github.com/rds1983/Myra/pulls?q=is%3Apr+is%3Amerged+author%3ANewbilius
[20] Flaticon: https://www.flaticon.com/
[21] FreeIcons: https://freeicons.io
[22] Iconfinder: https://www.iconfinder.com/
[23] интересная статья на эту тему: https://habr.com/ru/companies/ruvds/articles/817577/
[24] ZapSlat: https://www.zapsplat.com/
[25] FreeSound: https://freesound.org/
[26] книгу о маркетинге игр: https://galyonkin.com/book/
[27] ссылку на игру: https://store.steampowered.com/app/3685900/Creepy_Support/?utm_source=habr&l=russian
[28] Источник: https://habr.com/ru/articles/912660/?utm_campaign=912660&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.