Создание текстовой игры

Сочинять тексты — сложно. Сочинять тексты для интерактивной игры со множеством вариантов ответов — еще сложнее.

Умеете грамотно построить фразу? Отлично. Постройте семь. При этом каждая должна быть хорошо написана, подходить трем разным персонажам и встраиваться в четыре разных контекста. Сочинять сюжет и диалоги к нелинейной текстовой игре — означает упражняться в упорстве, изворотливости и трудолюбии.

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

Я недавно выпустил свою первую полноценную текстовую игру для Choice of Games под названием The Last Monster Master (в ней примерно 250 000 (!) слов). В процессе я пришел к определенным базовым схемам, — они помогли написать игру глава за главой. Я использовал отличный (и бесплатный) Chat Mapper, чтобы создать каждую нелинейную главу. Затем я перевел окончательный вариант текста в ChoiceScript, собственный язык программирования Choice of Games, удобный для создания текстовых игр.

Скриншот из игры The Last Monster Master

Я упростил процесс, разбив работу над каждой главой на шесть этапов. В Chat Mapper есть очень удобная функция — она позволяет присваивать свой цвет каждому текстовому блоку. Я использовал эту фичу, чтобы отслеживать ключевые моменты работы с текстом, — изменял цвет каждый раз, как заканчивал этап (это можно увидеть на приведенных ниже скриншотах)

Этап 1. Текстовые заготовки (без цветового маркера)

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

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

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

В приведенной ниже схеме из The Last Monster Master один из монстров игрока застрял в дереве во время атаки. Игрок может использовать телепатию или навык чтения языка тела, чтобы помочь монстру отразить атаку, или подбежать и помочь напрямую.

Этап 2. Ревизия текстовых заготовок (цвет — желтый)

На этом этапе сконцентрируйтесь на проверке того, что уже создали. Пока что вас должно волновать только то, как расположены диалоги — не переживайте насчет грамотности или красоты текста, поскольку все, что вы написали, еще не раз может подвергнуться переделке.

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

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

Этап 3. Текст в первом приближении (цвет — оранжевый)

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

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

Этап 4. Проверка текста (цвет — фиолетовый)

Выжили после того, как написали целую главу? Отлично! Дальше все пойдет быстрее. Включаем режим беспощадного редактора.

Прочитайте написанный вами текст. Будьте безжалостны. Проверьте все, что относится к тесту — грамматику, пунктуацию, будьте точны в выборе слов, описании персонажей или мест и так далее. Повторюсь: сосредоточьтесь на тексте. Заставьте его зазвучать.

Этап 5. Варианты (цвет — голубой)

Со структурой разобрались, текст выглядит пристойно. Теперь пройдитесь по всей главе еще раз. Ищите все места, где возникает вариативность, особенно те, где меняется статус игрока или где от него зависит поворот сюжета. Возможно, на этом этапе придется добавить варианты взаимодействия с уникальными артефактами, персонажами, появляющимися только один раз — и так далее.

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

Если заведете отдельный документ, в котором отражено, насколько статус игрока задействован в главе или в важном сюжетном повороте, — это вам здорово поможет.

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

Этап 6. Экспорт и игровая логика (цвет — зеленый)

Время поместить почти готовую главу в программу, которую вы используете непосредственно для разработки игры. К счастью, Chat Mapper экспортирует файлы в формате XML, JSON, Excel и Rich Text, — что дает вам возможность выбирать. В случае с The Last Monster Master я просто скопировал каждый ключевой элемент в файл ChoiceScript, видоизменив их по мере необходимости.

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

Другие методы

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

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



Как я решил сделать текстовый квест для iOS и что из этого вышло. Часть II, работа над ошибками +3

  • 07.02.20 12:57
  • Shalugin
  • #487282
  • Хабрахабр
  • 10
  • 2100

Разработка игр, Разработка мобильных приложений, Разработка под iOS, Flutter, Swift

Начало истории .
Вкратце:
Последние три года жизни я работал на круизных лайнерах.
Женился. Пришлось искать другую профессию.
Поиски протекают вяло. И одним прекрасным вечером я решаю купить себе макбук и стать разработчиком iOS.
Иду на Udemy. Начинаю учиться.
На одном занятии мы делаем текстовую игру-клон Lifeline.
Я загораюсь идеей сделать полноценную текстовую игру по своей книге в жанре фэнтези.
Полгода головных болей, недосыпаний, недоеданий.
Наконец, игра готова.
Релиз…
Итак, что же было дальше?

Ожидания VS Реальность

Скажу сразу: чуда не произошло.
Не то, чтобы я на него очень надеялся. Но знаете, как бывает. Говоришь самому себе: будем реалистами, в 2020 г. вероятность завоевать App Store с текстовой игрой крайне невелика… Говоришь, а сам про себя думаешь: невелика-то понятно… ну а вдруг?
Ну так вот «а вдруг» в этот раз не произошло. Что же тогда произошло? Давайте поглядим.

В глаза бросается несколько вещей.
а) Резкий всплеск в начале графика.
б) Весьма тоскливый уровень конверсии.
в) Число 119 (йееее!).
Ну, всплеск в начале графика — явление нехитрое. Связан он с блистательно мной проведенной маркетинговой компанией, которая свелась к одному посту на хабре и одному на пикабу.
Всё? Да, всё.
На счет конверсий рассуждать можно довольно долго. А можно и докторскую написать.
Возможные причины низкой конверсии я вижу две.

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

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

После

На мой (опять-таки) исключительно субъективный взгляд улучшения налицо. Однако к значительному увеличению конверсии они не привели. Что (опять-таки) заставляет задуматься об объективности моего исключительно субъективного взгляда.

Едем дальше.

Что я делал последний месяц?

Помимо переделки скриншотов и изучения (разглядывания) статистики на AppStore Connect. Возможно, вы удивитесь (сам я, к примеру, удивился), но я, оказывается, не сидел сложа руки. Наученный горьким опытом своих предыдущих проектов — от музыкальных до литературных — едва поняв, что завоевать App Store своей текстовой игрой мне не судьба, я махнул рукой и… что бы вы думали? Правильно, стал завоевывать Google Play.
Решение было продиктовано рядом причин, но главная заключалась в том, что маркетолог и пиарщик из меня так себя, а программист… ну ладно, программист, может, тоже пока так себе — но во-первых, я учусь (на программиста, а не на пиарщика), а во-вторых, писать код мне все же интереснее, чем писать рекламные статьи и пресс-релизы.
Сказано — сделано.
Я снова пошел на Udemy, приобрел курс «The Complete 2020 Flutter Development Bootcamp with Dart» за аторством той же Анджелы Ю, у которой я учился Свифту… и чуть менее чем за месяц закончил курс и портировал игру на Андроид.
Что же было дальше?

Работа над ошибками

Ровным счетом ничего. По крайней мере пока.
Ну согласитесь, странно ожидать головокружительного успеха в Play Market, когда даже намека на него не было в App Store.
Ну то есть, странно-то конечно странно, но есть в голове такой голос, который говорит: а вдруг?.. Здесь должен быть грустно-умудренный смайлик, но таких, по-моему, еще не изобрели.
Итожу, дамы и господа.
Если вы это читаете и тоже подумываете сотворить что-нибудь в духе того, что сотворил я, то вот вам мои пять копеек:
Что я сделал не так.

  1. То, что я делаю сейчас (бишь написание этой статьи на хабре), нужно было начать делать, когда мне только пришла в голову идея сделать игру. А еще лучше — когда мне пришла в голову идея купить мак. А еще лучше — когда я еще работал на лайнерах. Плаваешь себе, работаешь и ведешь бложик на ютубе. Красота?
    Короче, блоггинг — наш/ваш/их путь к успеху.
  2. Когда долго-долго что-то делаешь — пишешь детективный роман, разрабатываешь приложение, рисуешь пейзаж за окном — рано или поздно наступает момент, когда тебе кажется, что ты закончил. И следом тут же возникает острое желание показать «законченное» маме/жене/друзьям/urbi et orbi… С этим желанием надо бороться. Лучшее, что вы можете сделать для себя и для своего творения, это отложить его в сторонку и заняться чем-нибудь другим. А через месяц вернуться и окинуть все свежим взглядом. О, сколько всего нового и удивительного вам откроется.
  3. Приложение должно работать. Как это ни странно. Не то что мы с Михалычем проверили, у нас все ок, релизим. А работать. Понятно, краш-логи вам придут в любом случае. Задача их минимизировать. Так что неделя на бета-тестирование и полтора тестировщика, как сделал я, это не путь джедая.

Что я сделал так.
Ну, это, что называется, вопрос дискуссионный.
По ощущениям: я уверенно прошелся по всем граблям, по которым мог. Но на самом деле не в этом дело. А в том, что по граблям этим я в общем-то куда-то вышел. И оттуда, где я сейчас, открываются в общем-то довольно любопытные перспективы.

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

В этой статье я опишу личный опыт написания первой версии текстовой MMO RPG для Телеграмма, используемые для этого технологии и этапы, через которые прошёл, при создании игры.

Введение, или как я докатился до всего этого

Начну немного издалека — с 2010-го года. Именно тогда я познакомился с браузерными играми и даже отдал им немало своего свободного времени. Через пару лет таких игр я захотел написать свою. Собрал несколько таких же энтузиастов в одной из этих браузерок и мы набросали некое подобие ТЗ для нашей будущей игры. На стадии написания ТЗ всё и закончилось тогда.

Но сама мысль поучаствовать «в большом гейм-деве» меня не покидала — теплилась где-то внутри, пока я занимался веб-программированием.

Так длилось до начала 2017-го года.

Примерно в середине января наша команда разработчиков получила заказ от одной широко известной компании для написания бота для нескольких мессенджеров. Так как серверная часть разработки в команде на мне, то и выбирал платформу в основном я. Сначала был опробован Microsoft Bot Framework для Skype и Telegram (замечу тут в скобках, что с Telegram до того момента я знаком не был). Bot Framework показал какие-то дикие задержки ответов на запросы пользователя из телеграмма и я принял решение работать напрямую с Telegram Bot API.

Так был написан первый бот, с играми никак не связанный.

Но в процессе его написания, я обнаружил несколько текстовых игр, реализованных в виде ботов для Telegram. Попробовал одну «классическую» MMO RPG про замки, мечи, крафтинг и прочее в том же духе. Понравилась сама идея разделения на 5 фракций и битвы между ними. Посмотрел, попробовал и вскоре понял, что вот оно — я могу сделать текстовую RPG. Для этого хватит моих ресурсов и моей мотивации.

Это было начало февраля 2017-го…

Создание первой версии текстовой MMO RPG

Во-первых, был выбран сеттинг — самая что ни на есть современность. Вначале игра была названа «Hacker Wars» и было решено, что существует 5 компаний, в которых работают хакеры и взламывают друг друга. За успешные взломы получают местную валюту и опыт, за провалы — теряют валюту.

Этот базис с нами до сих пор, хотя и постоянно перебалансируется (об этом в другой раз).

Персонаж, по классике, имеет уровень и текущий опыт. С ростом опыта растёт и уровень персонажа. Тут ничего сложного.

Далее нужно было определить навыки персонажа. Силу, Защиту, Ловкость и прочие физические параметры я использовать не мог — хакеры не дерутся физически. Поэтому я выбрал 4-е таких параметра, противоположных друг другу попарно: Практика-Теория, Хитрость-Мудрость.

Следующие 3 дня я посвятил балансировщику и отрабатывал на нём различные формулы взаимодействия этих 4-х параметров у различных персонажей.

В этот момент было решено, что будет не просто сравнение параметров у соперников и у кого больше, тот и победил. Это скучно и нет никакого игрового момента. Нужна была именно схватка, с шансами попадания, уворота (аналоги взяты всё-таки из физического мира, чтоб проще объяснять). Или, что то же самое — с шансом взлома, ухода от взлома. За это отвечали Хитрость и Мудрость + рандом. А за сумму урона и критические удары — Практика и Теория. Т.е. я не стал ничего изобретать, просто назвал навыки более подходящим образом.

Итак, 3 дня и миллионы боёв ботов друг с другом были проведены.

Следующий этап — это так называемый «шмот». Различные мечи, щиты, луки и прочий скарб в классических RPG. Или плазмоганы в постапокалиптических. В современных реалиях я принял решение использовать Гаджеты. У персонажа 6 слотов под каждый вид гаджета. В одном слоте можно носить только один соответствующий гаджет.

После проведения расчётов стоимости гаджетов и их прибавке к навыкам персонажа, получил такую табличку (табличку позже подготовила девушка-игрок, в моей версии был просто spreadsheet):

Основы RPG заложены — навыки и гаджеты. MMO взаимодействие добавлено — битвы 5 компаний. Формулы прибавки опыта и утаскиваемой при успешном взломе валюты — расписаны. Но чего-то не хватало. Хотелось какой-то изюминки.

Так на 7-ой день (и увидел программист, что это хорошо 🙂 ) в проекте появились Акции всех 5-ти компаний. Игрок мог купить акции любой компании, но на руках после покупки у него должна была оставаться некая сумма в местной валюте — таким образом к началу битв у игроков часто оказывались непустые кошельки, было что утащить при успешном взломе. Это стало первой увязкой акций и битв между собой. Следующий шаг — изменение стоимости акций в зависимости от результатов каждой битвы. Если компанию взломали — акции теряют в цене, если взломать не смогли, акции поднимаются в цене. Так акции стали влиять на битвы, а битвы — на акции.

В этот же момент я принял решение переименовать игру в Startup Wars — Битвы Стартапов.

Из подобных же MMO проектов была взята и основная «валюта» продвижения — Энергия, которая пополняется со временем и увеличивается за счёт привлечения друзей по партнёрской ссылке — тут я не стал изобретать велосипед. Единственное — у нас эта валюта названа Мотивация. Некоторые действия игрока требуют затрат мотивации, а взамен дают опыт, деньги и прочие ресурсы.

Параллельно со всеми механиками шла работа и над созданием интерфейса игры. У телеграмм-бота есть два вида кнопок — «обычные» текстовые кнопки под строкой ввода и инлайновые — над строкой ввода. Плюс к кнопкам есть команды, начинающиеся со слеша, например /help.

Мной был принят ряд архитектурных решений на основе имеющихся интерфейсов. Так основные перемещения по разным «сценам» игры осуществляются через текстовые кнопки под строкой ввода. Там стараюсь держать не более 6 кнопок с учётом 1-ой для возврата в главное меню (главное меню — профайл персонажа). Если на какой-то странице 1-2 действия для принятия решения (например, подтверждение операции продажи всех акций на руках) — то использую инлайновые кнопки. Если же операций на странице много (например, покупка гаджетов в местном интернет-магазине) — то использую команды, начинающиеся со слеша.

Дело подходило к середине февраля, на 15-ое у меня была назначена операция, после возвращения с которой я собирался запускать проект. До операции оставалось пару дней, которые я потратил на введение в состав игры обширного хелпа и доработку различных мелочей (а дьявол как раз и кроется в мелочах) — например, если покупаешь более мощный гаджет для руки, то он автоматически заменят старый, а старый кладётся в рюкзак.

Первая версия была разработана ровно за 14 дней, в перерывах между основной работой.

Запуск первой версии текстовой MMO RPG

Итак, я вернулся из больницы и на следующий же день организовал запуск. Ребята из нашей команды помогли с настройкой сервера. На тот момент это был 1 основной игровой бот, получающий апдейты от телеграмма через long-polling. Плюс к нему пара скриптов на сервере, выполняемых по cron — сами битвы, проходящие автоматически раз в 3 часа в дневное время и скрипт восстановления потраченной мотивации.

Одновременно с запуском бота, я зарегистрировал 5 закрытых групп в телеграмме — по одной на каждую из противоборствующих компаний. Плюс одна открытая группа — для общения всех игроков между собой. Плюс канал новостей — про обновления самой игры. Художник из нашей команды подготовил красивые логотипы для всех этих 6 чатов, игрового бота и новостного канала.

На всём этом нехитром наборе контента мы и стартовали 18-го февраля вечером. К запуску приурочили статью на Спарке, откуда и получили первых игроков. Эти игроки уже раскидали друзьям промо ссылки на повышение мотивации и через 6 дней у нас было около 400 игроков.

Игра текстовая, т.е. после каждого действия игрока игра отправляет ему какой-то ответ. На момент старта все тексты подготовил я сам. Тогда имелось всего 2 квеста, где можно было потратить мотивацию — Работа и Прогулка. На работе игрок зарабатывал больше денег, но меньше опыта. На прогулке же больше опыта, но меньше денег. Каждый квест требовал вложений 1 мотивации и заканчивался через 5 минут реального времени. При окончании квеста игроку отправлялась случайная фраза из набора нескольких фраз с описанием события, которое произошло с ним на работе или прогулке.

Где-то на третий день после старта, на кураже, я решил провести конкурс окончания фраз прогулки и работы. «Реализовал» очень просто — предложил в главном чате игры писать фразы для конкурса с хештегом #sw_конкурс. И всё.

Через пару дней у нас уже было 109 фраз разной степени интересности.

И тут я понял, что пора бы эти фразы как-то систематизировать, отправлять к себе в базу и затем использовать в игре. Забегая вперёд, скажу, что эти фразы так и не попали в первую версию игры.

Так появился второй бот для игры, который я, недолго думая, назвал SW Информатор — что-то вроде электронного гида-помощника. Его я «подселил» во все 6 игровых чатов и он был призван собирать фразы для конкурса с хештегом. Буквально сразу после запуска этого бота, я придумал новый хештег для него — #идея. Каждый игрок мог предложить любую идею по улучшению действующего функционала игры или предложить совершенно новый функционал. В дальнейшем появились и другие хештеги, популярным из которых, к примеру, является #баг — это баг-репорт от игроков. За найденные баги и реализованные в игре идеи я расплачивался внутреигровой валютой.

Итак, игра была запущена и вокруг неё начало постепенно образовываться комьюнити. Я фиксил найденные игроками баги и реализовывал интересные идеи. К сожалению, в самом конце февраля я попал в больницу на 3.5 месяца и мои друзья были вынуждены остановить сервер игры 3 марта. Так перестала существовать первая версия моей первой игры.

Используемые технологии

  • язык программирования: nodejs
  • библиотека работы с Telegram Bot API — http://telegraf.js.org/. Понравилось разбиение на плагины (использую redis session и flow), middlewares, контекст.
  • в качестве оперативной базы взят redis — всё хранится и используется через него. Любые временные параметры персонажа, которые не нужно запоминать навсегда, также хранятся тут.
  • в качестве долговременной базы взята mongodb — здесь сохраняются все данные игрока, компаний сразу после битв. Используется для аналитики и как резервное хранилище данных.
  • в первой версии все отложенные действия (5-ти минутные задачи «прогулка» и «работа») были реализованы через setTimeout.

Примечание