Привет, Хабр! Меня зовут Катя Невзорова, я старший программист в студии 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 будет уже не узнать.