Вступление
Когда я пришёл в команду Owlcat Games в начале 2019-го, я практически попал на работу мечты: делать однопользовательскую ролевую игру для ПК, да ещё и не уезжая из России? Ещё недавно о таком можно было только мечтать! Оставался один маленький минус — я всегда предпочитал игры с пошаговыми сражениями, а Pathfinder: Kingmaker задумана как игра с боями в реальном времени и тактической паузой. Но что делать — не все мечты сбываются разом?
Однако такое бывает. Когда зашла речь о портировании игры на консоли, стало понятно, что с боями надо что-то делать. Микроменеджмент партии в бою, особенно на высоких уровнях сложности, крайне затруднителен, когда у тебя в руках вместо мышки и клавиатуры геймпад. Разумеется, можно было бы попробовать улучшить искусственный интеллект персонажей и сделать его настраиваемым, но это решение выглядело не слишком хорошим: получилась бы игра в программирование ИИ, а не Pathfinder.
Мы очень удачно мы узнали о превращавшей нашу игру в пошаговую модификации, созданной талантливым и крайне упорным фанатом Hsinyu Chan. Мы ознакомились с ней и оценили по достоинству: игра преображалась на глазах, причём исключительно в лучшую сторону (если, конечно, вы любите сидеть и думать над каждым ходом). Это окончательно склонило чашу весов в пользу добавления официального пошагового режима.
Мы получили разрешение от автора модификации использовать её код и приступили к его внедрению в игру. Но это была лишь основа — хотя модификация и сделана замечательно, её автор, не имея доступа к исходному коду, была ограничена в возможностях. Да и, чего уж там говорить, требования, предъявляемые к фанатскому моду и официальному функционалу игры, сильно отличаются.
Поиск пути
Первое, что мы решили исправить, — полную непредсказуемость траектории движения персонажа. Дело в том, что во время боя в реальном времени персонаж не может однозначно предсказать путь, поскольку во время движения ситуация всегда может измениться, например, свободный проход могут перегородить. Поэтому при изначальном поиске пути персонаж не учитывал динамических препятствий, в первую очередь — других персонажей. Далее, уже при движении по пути, если персонаж встречал препятствие, то пробовал обойти его слева или справа, согласно отдельному алгоритму. В хаосе боя в реальном времени это не слишком заметно, но в пошаговом бою, когда двигается лишь один боец, такое поведение бросалось в глаза, как кошка во время грозы.
Выглядело это так: даже если путь полностью перегорожен другими персонажами, текущий персонаж приближался к живой баррикаде и начинал ходить вдоль неё туда-сюда, пока не кончится ход. Похоже на ошибку, хотя на самом деле всё так и должно быть. Хуже того, такой подход не давал предсказать и показать игроку путь, которым пойдёт персонаж. Вот это и предстояло изменить.
Попытка номер 0
Очевидным решением было бы виртуально пройти по пути, не двигая персонажа на экране. Тогда можно получить траекторию движения и показать её игроку. Но это тупиковый вариант: траектория-то всё равно получалась безумной. Можно было попытаться её как-то оптимизировать, спрямить зигзаги и так далее, но это тоже выглядело бесперспективным. Что ж, назад, к чертёжной доске!
Основная проблема была в том, что поиск пути осуществлялся по разбитой на треугольники (так называемый navmesh) карте. Это крайне эффективно и быстро, но, к сожалению, при этом трудно изменять карту, например — отмечать участки, заблокированные другими персонажами. Это требует перестройки области карты, а потенциально — всей карты в целом. В реальном времени мы такого себе позволить не могли. Но в походовом режиме с одним активным персонажем... Почему бы и нет.
Попытка номер 1
Мы попробовали вырезать вокруг стоящих персонажей дырку, непроходимую для текущего бойца. У этой идеи оказалось несколько существенных недостатков. Во-первых, дырка получалась довольно большая, что могло в каких-то случаях помешать подойти к цели поближе, хотя с виду это возможно. Во-вторых, большой персонаж мог подойти к маленькому, остановиться и вырезать вокруг себя огромную дыру — и вполне возможно, что маленький персонаж оказался бы внутри дыры и вообще не смог бы ходить. Но окончательно убило идею то, что алгоритм вырезания дыр попросту не работал: иногда вырезал лишнее, делая здоровый кусок карты непроходимым. Мы попробовали обновить версию библиотеки, которой пользовались для поиска пути, но стало лишь хуже: в новой версии почему-то стали непроходимыми все ковры в особняке Джаманди. Учитывая прочие минусы, мы решили не заморачиваться и попробовать следующий вариант.
Попытка номер 2
Треугольники навигационной сетки плохо подходят для записи динамического положения персонажей. А что хорошо? Старая добрая квадратная сетка. Легко определить, в какой клетке или даже в каких нескольких клетках находится боец, и запретить прочим ходить по ним. И если клетки достаточно маленькие, только они и будут заблокированы, ничего лишнего. Почему бы не воспользоваться квадратами сразу? А потому, что клеток получается гораздо, гораздо больше, чем треугольников в навигационной сетке. Поэтому поиск пути по ним работает намного медленнее — слишком медленно для боёв в реальном времени, где все персонажи постоянно куда-то идут. Но в пошаговом-то бою ходит только один персонаж...
Чтобы осуществить эту идею, пришлось добавить к каждой карте в игре квадратную сетку, созданную на основе треугольной. Мы не могли использовать 5-футовые клетки, как в настольной игре — это потребовало бы переделки всех карт, поскольку при их создании 5-футовую сетку никто не учитывал, и, например, дверь шириной в одну 5-футовую клетку могла оказаться посредине между двумя реальными клетками. Поэтому, мы сделали клетки поменьше, шириной в полметра, и постарались сделать так, чтобы доступная для прохода область на каждой карте максимально совпадала для обоих способов поиска пути.
Отдельным вызовом стали двери. Открывая и закрывая их, изменшяешь проходимость области пока идёт анимация. Особый код следит, чтобы эти изменения отражались на сетке.
В целом, мы довольны результатом, хотя пришлось затратить немало усилий и даже исправить несколько ошибок в стороннем коде, которые не проявлялись в режиме реального времени с паузой. Зато новый способ поиска пути дал возможность точно показать игроку, как именно пойдёт его персонаж к цели, и даже предупредить о возможных Attack of Opportunity на пути.
Панель предсказаний
Добавляя в игру походовый режим, мы не только стремились сделать игру приятнее для предпочитающих такой стиль сражений, но и понятнее в целом. Pathfinder в этом плане не самая простая система, особенно по сравнению с современными компьютерными ролевыми играми, где, как правило, ход состоит из двух простых действий — движения и атаки, с возможностью заменить атаку на дополнительное движение.
В Pathfinder, как минимум, три важных типа действий — Standard, Move и Swift. И чтобы всех запутать, Move может быть использовано не только для движения, но и для других действий, а также для некоторых заклинаний. В режиме реального времени с паузой эти детали несколько спрятаны от игрока, хотя для игры на высоких сложностях приходится в них разбираться. Но в пошаговом режиме они выходят на первый план, и для игроков, не очень знакомых с системой, невозможность совершить то или иное действие в зависимости от, казалось бы, не очень связанных обстоятельств может стать сюрпризом.
Панель предсказаний с разбиением по действиям. Иногда, действие в целом может быть не потрачено, но делать определённые вещи в его рамках — уже невозможно (например, после 5-футового шага нельзя двигаться ни за Move, ни за Standard, но можно использовать их для других целей). Для таких случаев мы показываем ещё доступные варианты иконками.
Мы решили попробовать улучшить жизнь игроков и придумали «Панель предсказаний». Это новая панель, которая появляется только в пошаговом режиме, и показывает, что произойдёт, если сейчас отдать текущему персонажу команду. На первый взгляд, это довольно тривиальная часть интерфейса, присутствующая во многих играх. Но нам пришлось изрядно поработать, прежде чем она стала показывать хоть что-то полезное.
Главной сложностью, конечно, стало то, что игра изначально не расчитана на походовый режим. Действия персонажей разбиты на части непрозрачно для внешнего кода. Скажем, нет отдельно действия «идти» и «ударить» — вместо этого, есть команда «ударить», в рамках которой персонаж движется к цели, а затем атакует. Более того, некоторые действия порождают другие действия. Особую боль доставили заклинания касания и класс Кинетик.
Для наступления эффекта заклинаний касания персонаж должен прикоснуться к цели — их реализация может быть либо неправильной, либо неудобной. По правилам Pathfinder персонаж сначала сотворяет заклинание, «заряжает его в руку», а потом может хоть год ходить с ним и заниматься другими делами, пока не прикоснётся к цели. При этом в первый ход после сотворения заклинания персонаж может попробовать совершить прикосновение бесплатно, за Free Action, а вот в последующие ему придётся сделать обычную атаку и потратить Standard Action. На первый взгляд, всё не слишком сложно, но есть нюанс: самое частое использование заклинаний касания — лечение — в других компьютерных играх работает иначе: выбираешь цель, подходишь к ней, лечишь. Если бы мы сделали так, как написано в книге — то есть, сначала заклинание сотворялось бы без цели, а потом надо было бы её выбирать, это было сбило с толку абсолютное большинство игроков.
В результате в режиме реального времени с паузой заклинания касания выглядят как и все остальные. Игрок выбирает заклинание, потом цель, и сразу что-то происходит. А именно: персонаж идёт к цели, подойдя к ней на определённое расстояние, сотворяет заклинание, а потом продолжает к ней идти, уже с заклинанием в руке. При этом, если за это время цель исчезла (например, умерла), можно выбрать новую цель, воспользовавшись иконкой заклинаний, появляющейся в панели действий (не самое удачное решение — как выяснилось, её почти никто не замечает, и игрокам кажется, что заклинание пропало даром).
Мы не могли полностью переделать работу таких заклинаний в пошаговом режиме, поэтому пришлось адаптироваться и учить «Панель предсказаний» учитывать особенности этого вида заклинаний. Впрочем, одно изменение мы всё-таки внесли: в пошаговом режиме персонаж при чтении заклинания касания никуда не идёт, а сразу колдует, и только потом, если необходимо, двигается.
С кинетиком же всё проще и сложнее. Проще в плане описания. Проблема кинетика в том, что это единственный класс, который делает что-то дольше одного раунда. Уменьшающее стоимость других умений кинетика умение Gather Power может занимать одно, два, или три действия, а всё применение умения в результате может занять полностью два раунда.
Здесь, опять же, нам пришлось отступить от правил Pathfinder ради привычности игрового процесса в компьютерные RPG. Вообще говоря, Gather Power не связан с применяемым умением. Игрок сначала заявляет, что собирает энергию, и только потом, когда этот процесс закончился (потенциально, на следующий ход) может применить, собственно, какое-то умение, для которого эту энергию собирал. К сожалению, в бою в реальном времени с паузой это было бы категорически неудобно: игроки бы постоянно забывали, что их кинетик начал собирать энергию. В результате мы решили, что игрок сразу же указывает, на что потратит собранную энергию, и более того — игра сама рассчитывает, сколько единиц энергии собрать, а игрок лишь выставляет максимум (то есть, если включить сбор 3 единиц энергии, а для умения требуется только 1, то именно 1 и будет собрана, и будет потрачено одно действие, а не три).
В пошаговом бою мы не смогли в разумный срок изменить этот подход. Результат нам не очень нравится, и мы попробуем улучшить его в Pathfinder: Wrath of the Righteous. Игроку по-прежнему предлагается установить максимум сбора энергии, выбрать умение, которое он хочет применить, и только после этого сбор энергии, собственно, начнётся. При этом, если сбор энергии займёт больше чем 1 действие (то есть, применять умение придётся уже в следующем ходу), то оно не будет применено автоматически, так как ситуация могла полностью измениться (например, цель могла пропасть). Это несколько контр-интуитивно и неудобно, но, к сожалению, мы работаем в рамках ограничений, заложенных режимом реального времени с паузой.
Умный курсор
Ещё одной важной проблемой стало разнообразие действий, которые может предпринять персонаж в свой ход, не считая умений и заклинаний. Пройдёмся по ним коротко. Персонаж может:
- Совершить полную атаку, потратив Full Round Action (Move+Standard);
- совершить обычную атаку;
- атаковать касанием, если в руке есть «заряженное» заклинание касания.
Кроме того, он может выбрать способ движения:
- 5-футовый шаг, при котором игнорируются Attack of Opportunity, но после которого нельзя больше двигаться;
- обычное движение.
При этом в ходе тестирования выяснилось, что игрокам часто хочется потратить на движение ровно Move Action, гарантированно не залезая в Standard. Поэтому мы разбили обычное движение на два типа: «на одно действие» и «на два действия».
Нам нужно было дать возможность игроку как угодно комбинировать эти варианты действия и движения с учётом доступности (например, у персонажа может не быть Full Attack, или он уже потратил одно действие на движение в этом ходу). Особой проблемой это стало на консолях: нельзя просто сделать пару переключателей, которыми игрок настраивал бы действия персонажа, на это просто не хватало кнопок на геймпаде.
Мы решили эту проблему, сделав «умный курсор». При наведении на цель игра сама выбирает оптимальный способ действия для текущего состояния персонажа (например, 5-футовый шаг + Full Attack, если это возможно). Кроме того, одной кнопкой можно перебирать другие доступные сочетания, если вдруг ваша тактика требует сделать не самое оптимальное на первый взгляд действие (например, спровоцировать Attack of Opportunity, применив обычное движение вместо 5-футового шага).
Трекер инициативы
Компактный трекер инициативы в фанатской модификации был по-своему хорош, но обладал рядом недостатков. Во-первых, он отображал фиксированное число персонажей. Если участников боя становилось больше, то не было возможности увидеть оказавшихся за границей отображаемого набора. Во-вторых, он не показывал здоровье участников боя и висящие на них эффекты заклинаний. И наконец, он просто не очень вписывался в стиль нашего пользовательского интерфейса.
Поэтому мы решили полностью его переписать с учётом особенностей компоновки экрана при управлении с геймпада. Появилось две версии — вертикальная, в левой части экрана (для геймпада), и горизонтальная, сверху (для мыши и клавиатуры). Кроме того, мы добавили в трекер портреты персонажей, чтобы проще ориентироваться, отображение здоровья и статусных эффектов, а также возможность прокрутки списка, чтобы видеть всех участников боя. А ещё при наведении курсора на персонажа на поле боя он подсвечивается в трекере.
Много споров вызвал дизайн трекера для геймпада, но после нескольких обсуждений мы пришли к варианту, когда текущий персонаж отображается в самому низу. Это сделано потому, что важная информация и органы управления боем расположены в нижней части экрана, а кроме того, увеличенный портрет персонажа наверху смотрелся несколько тяжеловесно.
Модификации
К сожалению, добавление официального пошагового режима напрочь ломает модификацию Hsinyu Chan — с этой версией игры она работать не будет. То же касается и модификаций, которые меняли элементы боя — их работоспособность в пошаговом бою не гарантируется, а «Панель предсказаний» может неверно учитывать вносимые изменения.
A cowboy’s work is never done
В целом, мы довольны работой, но в будущем улучшим пошаговый режим по вашим отзывам и собственным соображениям. В первую очередь, это касается неочевидности управления в некоторых случаях, а также внутреннего устройства «Панели предсказаний», которое получилось очень сложным, что чревато ошибками.
Надеемся, что вам понравится результат. Если вы колебались, стоит ли играть из-за реального времени с паузой — поводов для сомнений не осталось. Если игра показалась сложной — попробуйте пошаговый режим. Сражения станут гораздо понятнее и управляемее. Или просто загляните в «Украденные земли» за новым опытом — лично я собираюсь, наконец, пройти второе DLC. ▲
Максим Савенков, программист Owlcat Games.