Тактическая карточная игра на геймпаде: как устроена поддержка контроллеров в Ancient Duel
Поддержка контроллеров обычно нужна играм про движение и прицеливание. В Ancient Duel нет ни того ни другого. Это карточная игра: вы смотрите на поле, какое-то время думаете, а затем делаете один отдельный выбор.
Именно поэтому геймпад ей и подошёл. Любое действие в дуэли сводится к одному и тому же короткому списку. Какая карта. Какая позиция. Какая цель. Подтвердить. Назад. Это родной язык контроллера — и он плохо ложится на устройство, чей главный талант — указывать на произвольные пиксели.
Контроллер не должен притворяться мышью
Соблазнительный короткий путь — позволить стику гонять курсор по экрану. Сделать это быстро, а пользоваться неприятно: в итоге вы водите указатель по пустому сукну, выполняя аналоговую работу ради цифрового выбора.
Поэтому Ancient Duel перемещает не курсор, а выделение. Стик или крестовина переходят между элементами, которые действительно что-то значат, — картой в руке, юнитом на поле, целью, кнопкой, вкладкой, — а «Подтвердить» активирует то, что выделено сейчас. Целиться не нужно никогда. Вы говорите: «следующая карта», «вот эта», «да».
Весь слой ввода подчиняется одному правилу, которое я установил с самого начала и ни разу не нарушил: он никогда не реализует игровое действие заново. Он перемещает фокус и даёт уже существующей кнопке сделать своё дело. Игрой можно было управлять с клавиатуры ещё со времён апрельской работы над доступностью, так что для поддержки контроллеров вообще не пришлось трогать игровую логику. Верно и обратное: всё, до чего нельзя добраться с клавиатуры, недоступно и с геймпада. Сделать что-то доступным для навигации — значит сделать это точкой фокуса, а не писать новый код ввода.
Поле уже было сеткой
Здесь у карточной игры есть преимущество, которого нет у трёхмерного мира. Поле боя Ancient Duel — это фиксированная конечная структура: четыре позиции для юнитов с каждой стороны, слот полководца посередине, ряд стратегии, рука, два кладбища, зона местности. Никакого непрерывного пространства, по которому нужно перемещаться.
Поэтому визуальная раскладка может просто стать навигацией. Влево и вправо — шаг вдоль ряда, вверх и вниз — переход между рукой и полем, а бамперы перескакивают сразу целые зоны, не проходя через всё, что лежит между ними. Правый стик прокручивает, а Start открывает настройки контроллера.
Фокус и есть курсор
С мышью игрок всегда знает, на что указывает, потому что указывает его собственная рука. Уберите указатель — и интерфейс должен постоянно отвечать на три вопроса: что выделено, что с этим сделает «Подтвердить» и что отменит «Назад».
Звучит очевидно, но именно сюда ушла бо́льшая часть кропотливой работы. Диалог, который открывается с выделением на кнопке закрытия, формально доступен для навигации, а на практике бесполезен: игра только что спросила, какую карту вы хотите сбросить, а подсветка стоит на ✕. Теперь диалоги открываются на первом настоящем варианте выбора, а режимы выбора цели ставят выделение на первую подходящую цель, а не просто подсвечивают все сразу: с указателем это было удобно, а без него превращалось в поиски.
Хорошая поддержка контроллеров — это не состояние, в котором до каждой кнопки можно дотянуться. Это состояние, в котором вы перестаёте думать о том, как до них дотянуться.
Никогда не доверяйте индексу кнопки
Эту часть я сильно недооценил.
Контроллер для ПК может сообщить, что использует стандартную раскладку, а затем пронумеровать свои кнопки так, как вздумается его прошивке. Геймпад, на котором я тестирую, делает ровно это, а вдобавок на нём напечатано 1 / 2 / 3 / 4 по часовой стрелке начиная сверху вместо A/B/X/Y. Так что за каждым нажатием скрываются три отдельных факта, и достоверно известен только первый: сырой ввод, физическое положение кнопки на корпусе и надпись рядом с ней. Игра, которая привязывает «Подтвердить» к «кнопке 0», угадывает два из трёх.
Поэтому в Ancient Duel есть мастер калибровки, и он никогда ничего не выводит из индекса. Физическое положение он узнаёт от ваших рук, а напечатанную надпись — с ваших слов о том, что написано на устройстве. Надписи выбираются из списка, а не вводятся, потому что на контроллере нет букв, — и это не украшение: если вы сообщаете игре, что на нижней кнопке написано «B», а на правой — «A», значит, у вас в руках устройство с раскладкой Nintendo, что бы ни думал браузер, и «Подтвердить» с «Назад» соответственно меняются местами.
Пропущенный элемент управления молчит. Никакого отката к угаданному индексу: бампер, подтверждающий сдачу, — ровно та ошибка, ради предотвращения которой калибровка и существует.
Калибровка, которая не может попросить мышь
Здесь кроется парадокс. Игрок, у которого контроллер настроен неправильно, — это именно тот игрок, которому нужен экран калибровки, и именно тот, кто не может пройти по обычному меню, чтобы до него добраться.
Поэтому весь дизайн подчиняется правилу: откалибровать, подписать, сохранить, открыть заново и починить контроллер должно быть можно без мыши и клавиатуры. На компьютере они работают для удобства, но ничто не должно их требовать.
На практике это значит, что мастер открывается фразой «нажмите любую кнопку, чтобы начать» и принимает любую сырую кнопку на любом подключённом геймпаде, а это нажатие заодно определяет, какому контроллеру принадлежит сеанс. Дальше идут подтверждение и отмена, и их пропустить нельзя. Начиная с третьего вопроса кнопка, которую вы только что назвали правой лицевой, возвращает вас на шаг назад, так что, нажав её достаточно раз, вы выйдете из мастера — это единственный выход, которому не нужен указатель. Каждый шаг захвата переходит дальше сам, потому что игроку, которого только что попросили нажать нижнюю лицевую кнопку, нечем нажать ещё и «Далее».
Почему он никогда не спрашивает про стик
Восемь вопросов, и каждый — про кнопку. Ни одного вопроса о направлениях.
Отчасти потому, что направления — надёжная часть: на контроллере со стандартной раскладкой левый стик приходит как первые две оси, и направленный ввод поэтому куда предсказуемее кнопок, которые производитель пронумеровал как ему вздумалось. Но главным образом из-за того, что я понял, лишь увидев, как это ломается. Кнопка либо нажата, либо нет. У оси нет осмысленного отпущенного состояния: изношенный стик гуляет, крестовина-«шляпка» покоится на 3,29, курок стоит на −1, — и любое из этого может ответить на вопрос, который никто не задавал, или не дать шагу завершиться по причине, которую ничто на экране не объяснит. Отказ от таких вопросов убрал целую категорию необъяснимого поведения.
Удержание направления повторяет шаг со скоростью, которую можно настроить, как и мёртвую зону, если стик дрейфует.
Ввод текста без букв
А потом вы натыкаетесь на текстовое поле, и контроллеру нечего предложить. Вход в аккаунт, название колоды, поиск по пулу карт — всему этому нужны символы, которых нет ни на одном геймпаде.
Поэтому «Подтвердить» на текстовом поле открывает на экране полную клавиатуру QWERTY. Это обычные кнопки в обычном слое, а значит, по ней работает та же навигация, и «Назад» закрывает её, как и всё остальное. Игрок с настоящей клавиатурой её никогда не увидит.
Одна деталь, важности которой я не ожидал: раскладка использует настоящий физический сдвиг рядов — те же смещения на четверть клавиши, что и у клавиатуры ANSI. Чтобы решить, куда ведёт «вверх», навигация читает отрисованную геометрию, поэтому именно сдвиг ставит W над промежутком между A и S. С более круглыми значениями всё ломается: при сдвиге ровно в половину клавиши каждая клавиша оказывается на равном расстоянии от двух нижних, и ничья решается тем порядком, в котором случайно идёт разметка.
Что контроллер нашёл в остальной игре
Самое полезное в этой работе — то, что она вскрыла. Мышь позволяет игроку маскировать проблемы интерфейса, указывая прямо на то, что ему нужно. Контроллер так не может, поэтому интерфейс должен делать эти связи явными, — и в нескольких местах оказалось, что он этого не делает.
Сохранённые колоды не были точками фокуса, а значит, без мыши колоду вообще нельзя было открыть. С кладбищами и местностью было то же самое. Редактор колоды перестраивал обе свои колонки при каждом добавлении карты, уничтожая кнопку, которую вы только что нажали, и сбрасывая ваше место; теперь он запоминает карту и действие и находит их снова. Собственные диалоги подтверждения и предупреждения браузера вообще находятся вне модели фокуса приложения, поэтому их заменили диалогами на странице, которые открываются на безопасном ответе.
Ни одна из этих ошибок не связана с контроллером. Это ошибки интерфейса, которые указатель тихо компенсировал, и их исправление сделало игру лучше и для тех, кто никогда не возьмёт в руки геймпад.
Steam, диваны и Deck
Один и тот же код работает в браузере, в сборке для Windows, которая используется в Steam, и в сборке для macOS, и все три используют одну и ту же систему контроллеров и одну и ту же логику настройки, — хотя сами настройки хранятся на устройстве, а не в вашем аккаунте.
Выигрыш здесь простой: ПК перестаёт быть только письменным столом. Одна и та же сборка работает на ноутбуке, на компьютере, подключённом к телевизору, и на диване с геймпадом в руках. Карточной игре это подходит лучше, чем большинству жанров, потому что естественная поза для Ancient Duel — откинуться на спинку и думать, а не склоняться вперёд и кликать.
Что касается портативных устройств вроде Steam Deck, честная позиция такова: фундамент заложен, а тестирование — нет. Steam Input может передавать ввод с контроллера через стандартную раскладку, совместимую с XInput, так что уже существующая модель в принципе служит полезной основой, а игра, которая никогда не предполагает наличия мыши, — важное условие для этого класса устройств. Я не проверял Ancient Duel на самом устройстве, поэтому не стану утверждать, что там всё работает. Есть и режим ТВ, который добавляет безопасные поля, потому что некоторые телевизоры до сих пор применяют overscan и обрезают часть изображения по краям, — а этого достаточно, чтобы кнопка сдачи оказалась за пределами экрана.
То же рассуждение применимо к любой будущей платформе. Консольной версии понадобилось бы гораздо больше, чем работа над вводом: SDK, сертификация, сервисы платформы, упаковка, одобрение магазина. Но один барьер можно убрать заранее, и он касается каждого экрана: игра не должна предполагать, что мышь существует. Это ещё не делает игру готовой к консолям. Это оставляет открытой дверь, которую потом дорого открывать заново.
Мышь никуда не делась
Всё это ничего не заменяет. Мышь и клавиатура работают ровно так же, как раньше, и на компьютере они по-прежнему быстрее. Смысл никогда не был в том, чтобы выбирать устройство ввода за игрока.
Дуэль, сыгранная на контроллере, — это не другая дуэль. Выбирается та же карта, назначается та же цель, принимается то же решение, с последствиями которого потом жить. Меняется лишь то, как выбор доходит до игры, — и чем меньше Ancient Duel предполагает о том, что у вас в руках, тем в большем числе мест можно сыграть ту же самую дуэль.
Daniel Rusu
Создатель и разработчик Ancient Duel