Призраки, шаманы и шамановоды: как мы конструируем геймплей для игры Rush Royal

57fec9cf5a75107480afd4f20f450eca.jpeg

Привет, Хабр! Меня зовут Катя Невзорова, я старший программист в департаменте Игры. В этом материале я решила поделиться тем, как мы с командой делаем геймплей для игры Rush Royal.

У самых популярных игр вроде шахмат, нардов, го или, например, покера, довольно простые правила, которые легко выучить. Однако они заставляют мозги кипеть, когда игра зашла далеко и перед тобой сильный противник. Впервые услышав про Rush Royale, я спросила, о чём эта игра, и мне ответили:»Защита башен (tower defence). Очень простой жанр, вроде «Тетриса», «Арканоида» или «Три в ряд»». Именно такие игры на собеседованиях просят написать в качестве тестового задания. В Rush Royale для игрока всё просто: можно выставить новую пешку, объединить две пешки, прокачать одну из них или применить способность героя. Создатели Rush Royal тоже начинают с простого на своей работе: готовят кирпичики и потом соединяют их между собой. Что из себя представляют эти кирпичики я и расскажу в этом материале.

Стань режиссером своей неповторимой игры

Для тех, кто не играл в Rush Royale, я кратко опишу устройство её мира. Итак, «откроем коробку и посмотрим, что входит в набор», как говорят в обзорах настольных игр. Мы видим доску с пешками и дорогу, по которой движутся зелёные бровастые слизни — враги. Пешки — это наши маги: красненький, голубенький, жёлтенький… Нужно расставлять их вдоль дороги и ДэПээСить врагов, не позволяя добраться до ворот замка:

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

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

Все зависит от того, какие пешки у нас в руке, но кроме них в игре в качестве актёров участвуют и другие сущности:  

Любая сущность может стать жертвой магической механики. Некоторые — герой, пешка, ловушка, враг, а также умершая пешки и взятый в бой предмет — являются продвинутыми сущностями и могут сами колдовать, и в результате заклинаний инициировать магические механики. Сущности обладают набором своих параметров и обмениваются тегами-метками при выполнении заклинаний. Но в Rush Royale заклинания не простые, они написаны на особом языке и заслуживают отдельного изучения. Готовы к инициации?

Всё есть эффект

Базовое понятие в RR-магии — это эффект. Не в привычном смысле «FX», а в смысле «единичное изменение в мире». Эффектом может быть всё, что происходит, видимое-слышимое или незаметное. Эффекты выстраиваются в причинно-следственные цепочки, как бусины нанизываются на нитку (с разветвлениями). Такая цепочка проигрывается, словно запуск салюта от подожжённого фитиля: по ходу применения перепрыгивает от сущности к сущности, меняет их параметры и проигрывает визуальные эффекты.

Цепочки эффектов Чумного Доктора, который кидает коктейли Молотова и ножи:

Как это сделано с точки зрения кода? У каждого эффекта есть источник, владелец и цель. Источником и целью может быть любая сущность, а вот владельцем — только продвинутая. Эффект чаще всего берёт параметры владельца и применяет их к цели, после чего уже она становится владельцем — и так по всей цепочке срабатывания эффектов. Цель может передать инициативу не одной, а сразу нескольким другим целям. Такая цепная реакция может гулять по полю ещё некоторое время. Это похоже на дерево действий, или блок-схему, или визуальное программирование сценариев в Unreal Engine. Только в нашем случае эффекты — разновидностей которых очень много — обычно срабатывают моментально и тут же «забываются». Ещё одно из достоинств наших цепочек эффектов — они совершенно одинаково исполняются на устройствах, играющих друг с другом по сети. Но с сетевой игрой есть подвох, о котором я расскажу ниже.

Создание и редактирование эффектов

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

У каждого эффекта своя конфигурация с настройками. Для работы с ними у наших дизайнеров есть два основных инструмента: WorkSpace и DebugTool. Первый позволяет редактировать эффекты без запуска игры.

Пример WorkSpace для Чумного доктора:

7d7d48df8dc095a6c0fcd2687e4fdcde.png

Пример WorkSpace для более сложного героя Mary (абилки и пассивки):

dde147790f0cfee5390ce5e75cabd6b2.png

Дизайнеры собирают эффекты в цепочки в виде дерева взаимосвязей. Там же можно сделать подложку с описанием эффекта. В последнее время это очень полезно, потому что эффекты сильно усложнились. 

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

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

53923c2f59e1281202b47aa4068732cc.png

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

Большая библиотека эффектов

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

Основные категории эффектов:

  • Изменяющие параметры сущностей (с визуальным эффектом).

  • Добавляющие и удаляющие теги.

  • Атакующие, наносящие урон (с визуальными эффектами), лечащие, ворующие здоровье.

  • Выбирающие новые цели (случайные, соседей, по диагонали, в радиусе).

  • Создающие, заменяющие на другие, удаляющие сущности.

  • Объединяющие и перемешивающие пешки на поле.

  • Таймеры (периодические, задержки).

  • Вызывающие другие эффекты по условию (триггеры, шансы, фильтры), определённое количество раз.

  • Удаляющие уже навешанные эффекты (глушащие, защищающие, убирающие совсем).

  • Запрещающие игроку что-то делать (улучшать пешки, объединять).

  • Меняющие значение маны.

  • Считающие разные величины (количество пешек определённого типа на поле, сумму их объединений, количество тегов на сущности, количество соседей, длину цепочки однотипных пешек).

  • Измеряющие расстояние до сущности.

  • Определяющие, что сложился какой-то паттерн на поле (горизонтальная или вертикальная линия, крест, три в ряд, фигурка из тетриса).

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

ТЗ, прототип или всё сразу?

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

Как мы попали с шаманами

При таком разнообразии игровых механик было лишь делом времени возникновение каких-нибудь курьёзов. И первым таким курьёзом стала история с шаманами. Шаманы — это пешки, которые сразу после объединения стреляют во врагов призраками, и пока призрак летит — довольно медленно, целых две секунды, — его можно перехватить. Но оказалось, что при игре по сети перехват не всегда был возможен. Мы обратили на это внимание, механика попала в эксплуатацию, и её начали использовать «шамановоды»: нечистые на руку игроки запускали призрака и сразу отключали у себя интернет, а после пролёта призрака снова включали — в этот промежуток времени другой игрок не мог быстро подтвердить своё действие перехвата. Дошло до того, что когда люди заходили в игру и видели, что противник с шаманами, то сразу выходили. Почему возник такой баг? Полёт призрака — это цепочка эффектов, одно из звеньев которой — попадание во врага. Эта цепочка исполняется локально на устройстве, и если у игрока порядок с пингом, то он и не заподозрит, что что-то может пойти не так и его контрудар не сработает. Но если у противника пинг слишком высокий (он быстро отключает себе интернет), перехват не срабатывал. Вся эта история случилось из-за того, что при разработке шаманов мы не сделали ТЗ и не написали прототип. 

Совершенно новые механики

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

Ещё мы придумали новый эффект для кнопок Power Up: если их нажать, то при появлении некоторых пешек меняется интерфейс. А если заходит панда, то у неё уже совершенно другая кнопка Power Up. Благодаря новым эффектам привычный tower defence будет уже не узнать.

© Habrahabr.ru