Привет, Хабр! Меня зовут Катя Невзорова, я старший программист в студии IT Territory. В этом материале я решила поделиться тем, как мы с командой делаем геймплей для игры Rush Royale.
У самых популярных игр вроде шахмат, нардов, го или, например, покера, довольно простые правила, которые легко выучить. Однако они заставляют мозги кипеть, когда игра зашла далеко и перед тобой сильный противник. Впервые услышав про Rush Royale, я спросила, о чем эта игра, и мне ответили: «Защита башен (tower defence). Очень простой жанр, вроде „Тетриса“, „Арканоида“ или „Три в ряд“». Именно такие игры на собеседованиях просят написать в качестве тестового задания.
В Rush Royale для игрока все просто: можно выставить новую пешку, объединить две пешки, прокачать одну из них или применить способность героя. Создатели Rush Royal тоже начинают с простого на своей работе: готовят кирпичики и потом соединяют их между собой. Что из себя представляют эти кирпичики, я и расскажу в этом материале.
Стань режиссером своей неповторимой игры
Для тех, кто не играл в Rush Royale, я кратко опишу устройство ее мира. Итак, «откроем коробку и посмотрим, что входит в набор», как говорят в обзорах настольных игр. Мы видим доску с пешками и дорогу, по которой движутся зеленые бровастые слизни — враги. Пешки — это наши маги: красненький, голубенький, желтенький… Нужно расставлять их вдоль дороги и ДэПээСить врагов, не позволяя добраться до ворот замка:
Однако этим дело не ограничивается: при определенном стечении обстоятельств срабатывают дополнительные магические механики, разные для разных пешек и героев, делающие игру интересней. В этом видео, например, слияние двух шаманов приводит к вызову призрака. Игра становится быстрее и динамичнее:
В начале видео панды прокачиваются и начинают быстрее стрелять. Чуть позже мы видим полет стрел, запускаемых героем противника. Сразу после этого две наши пешки-метеора объединяются, и снаряд-метеорит летит по врагам. Перед окончанием вражеской волны собираются души всех живых пешек и добавляют здоровья боссу следующей волны.
Все зависит от того, какие пешки у нас в руке, но кроме них в игре в качестве актеров участвуют и другие сущности:
-
герои;
-
пешки;
-
слоты;
-
ловушки;
-
враги;
-
цели на доске;
-
цели на дороге.
Любая сущность может стать жертвой магической механики. Некоторые — герой, пешка, ловушка, враг, а также умершие пешки и взятый в бой предмет — являются продвинутыми сущностями и могут сами колдовать, и в результате заклинаний инициировать магические механики. Сущности обладают набором своих параметров и обмениваются тегами-метками при выполнении заклинаний. Но в Rush Royale заклинания не простые, они написаны на особом языке и заслуживают отдельного изучения. Готовы к инициации?
Все есть эффект
Базовое понятие в RR-магии — это эффект. Не в привычном смысле «FX», а в смысле «единичное изменение в мире». Эффектом может быть все, что происходит, видимое-слышимое или незаметное. Эффекты выстраиваются в причинно-следственные цепочки, как бусины нанизываются на нитку (с разветвлениями). Такая цепочка проигрывается, словно запуск салюта от подожженного фитиля: по ходу применения перепрыгивает от сущности к сущности, меняет их параметры и проигрывает визуальные эффекты.
Цепочки эффектов Чумного Доктора, который кидает коктейли Молотова и ножи:
Как это сделано с точки зрения кода? У каждого эффекта есть источник, владелец и цель. Источником и целью может быть любая сущность, а вот владельцем — только продвинутая. Эффект чаще всего берет параметры владельца и применяет их к цели, после чего уже она становится владельцем — и так по всей цепочке срабатывания эффектов. Цель может передать инициативу не одной, а сразу нескольким другим целям. Такая цепная реакция может гулять по полю еще некоторое время. Это похоже на дерево действий, или блок-схему, или визуальное программирование сценариев в Unreal Engine. Только в нашем случае эффекты — разновидностей которых очень много — обычно срабатывают моментально и тут же «забываются».
Еще одно из достоинств наших цепочек эффектов — они совершенно одинаково исполняются на устройствах, играющих друг с другом по сети. Но с сетевой игрой есть подвох, о котором я расскажу ниже.
Создание и редактирование эффектов
Эффекты придумывают наши дизайнеры. Работа начинается с продумывания идеи, лежащей в основе какой-нибудь архетипической сущности-персонажа: мага холода, плута, ведьмы, шамана и т.п. После этого дизайнеры изобретают эффекты, с помощью которых можно реализовать особые способности персонажа. Затем пишут дизайн-документ, в котором описывают, как нужно собрать персонажа, собирают и тестируют в игре.
У каждого эффекта своя конфигурация с настройками. Для работы с ними у наших дизайнеров есть два основных инструмента: WorkSpace и DebugTool. Первый позволяет редактировать эффекты без запуска игры.
Дизайнеры собирают эффекты в цепочки в виде дерева взаимосвязей. Там же можно сделать подложку с описанием эффекта. В последнее время это очень полезно, потому что эффекты сильно усложнились.
А чтобы посмотреть на работу эффектов в игре, нужен другой инструмент, визуализирующий историю их выполнения и позволяющий проследить, сколько раз, на ком и с какими значениями был исполнен тот или иной эффект. Это позволяет опробовать работу цепочки в игре с меньшим привлечением программистов.
На скриншоте ниже можно увидеть, сколько раз применились эффекты Чумного Доктора, активны ли они сейчас, узнать, кто был источником, владельцем и целью, какие теги висели на этих сущностях и так далее:
Часто бывает, что эффект проигрывается, но что-то посчиталось неправильно. Можно поставить игру на паузу и отмотать исполнение цепочек назад, ведь они очень быстро пролетают и можно что-то не заметить. Поэтому для дальнейшего анализа сохраняется вся история срабатывания эффектов.
Большая библиотека эффектов
Все эффекты делятся на категории: триггеры, селекторы, фильтры, тикающие, задержки, щиты и атаки. Например, фильтры проверяют ситуацию, и если выполняются заданные условия, то срабатывает необходимая последовательность других эффектов. Тикающие перестают работать, когда прошло достаточно времени с того или иного события.
Основные категории эффектов:
-
Изменяющие параметры сущностей (с визуальным эффектом).
-
Добавляющие и удаляющие теги.
-
Атакующие, наносящие урон (с визуальными эффектами), лечащие, ворующие здоровье.
-
Выбирающие новые цели (случайные, соседей, по диагонали, в радиусе).
-
Создающие, заменяющие на другие, удаляющие сущности.
-
Объединяющие и перемешивающие пешки на поле.
-
Таймеры (периодические, задержки).
-
Вызывающие другие эффекты по условию (триггеры, шансы, фильтры) определенное количество раз.
-
Удаляющие уже навешанные эффекты (глушащие, защищающие, убирающие совсем).
-
Запрещающие игроку что-то делать (улучшать пешки, объединять).
-
Меняющие значение маны.
-
Считающие разные величины (количество пешек определенного типа на поле, сумму их объединений, количество тегов на сущности, количество соседей, длину цепочки однотипных пешек).
-
Измеряющие расстояние до сущности.
-
Определяющие, что сложился какой-то паттерн на поле (горизонтальная или вертикальная линия, крест, три в ряд, фигурка из тетриса).
Конечно, мы не придумывали все сразу. Большинство эффектов и целые категории добавляли в игру постепенно. За время ее развития у нас накопилось очень много разных эффектов, позволяющих собирать персонажей почти без участия программистов. Сегодня дизайнеры собирают цепочки, словно бусины нанизывают на нитку. Для упорядочивания работы мы храним все эти «бусины»-эффекты в единой библиотеке, поэтому для сборки новых персонажей почти не приходится привлекать программистов, дизайнеры справляются сами.
ТЗ, прототип или все сразу?
Еще немного подробностей о нашей работе. Когда мы создаем совершенно новую игровую механику, то одновременно пишем ТЗ для программистов и прототип для дизайнеров. Во-первых, так мы экономим время и быстрее выводим фичи в эксплуатацию, а во-вторых, программисты сразу могут выловить потенциальные ошибки. А чтобы ТЗ не было просто словесным описанием, мы сразу делаем технический прототип, выполняющий роль черновика — код может быть не слишком чистым, требующим дальнейшего рефакторинга.
Как мы попали с шаманами
При таком разнообразии игровых механик было лишь делом времени возникновение каких-нибудь курьезов. И первым таким курьезом стала история с шаманами. Шаманы — это пешки, которые сразу после объединения стреляют во врагов призраками, и пока призрак летит — довольно медленно, целых две секунды, — его можно перехватить. Но оказалось, что при игре по сети перехват не всегда был возможен.
Мы обратили на это внимание, механика попала в эксплуатацию, и ее начали использовать «шамановоды»: нечистые на руку игроки запускали призрака и сразу отключали у себя интернет, а после пролета призрака снова включали — в этот промежуток времени другой игрок не мог быстро подтвердить свое действие перехвата. Дошло до того, что когда люди заходили в игру и видели, что противник с шаманами, то сразу выходили.
Почему возник такой баг? Полет призрака — это цепочка эффектов, одно из звеньев которой — попадание во врага. Эта цепочка исполняется локально на устройстве, и если у игрока порядок с пингом, то он и не заподозрит, что что-то может пойти не так и его контрудар не сработает. Но если у противника пинг слишком высокий (он быстро отключает себе интернет), перехват не срабатывал. Вся эта история случилась из-за того, что при разработке шаманов мы не сделали ТЗ и не написали прототип.
Совершенно новые механики
Опыт с шаманами не испугал наших дизайнеров, но они теперь осторожно относятся к новым механикам: вдруг мы что-то сделаем, а оно не заработает. Введенная практика совместных ТЗ и прототипов помогает избежать подобного и создавать совершенно новые механики. Например, мы придумали панду, которая умеет выпивать ману и превращаться в иное существо на 10 секунд, а за это время другие игроки могут успеть как-то среагировать. После шаманов мы опасались, что эта цепочка эффектов тоже может плохо работать по сети. Но написали прототип и поняли, что таких проблем нет.
Еще мы придумали новый эффект для кнопок Power Up: если их нажать, то при появлении некоторых пешек меняется интерфейс. А если заходит панда, то у нее уже совершенно другая кнопка Power Up. Благодаря новым эффектам привычный tower defence будет уже не узнать.