Ходы из нескольких шагов и боевой интерфейс
Как план бойца на раунд стал цепочкой действий: очередь приказов, цена поворота, курсор планирования и интерфейс, в котором видно, сколько времени что займёт.
В первой версии боя боец получал на раунд один приказ: дойти до клетки или выстрелить. Добежав, он стоял до конца раунда, хотя времени оставалось ещё на полдела. Тогда появилась идея задать бойцу план на весь раунд: добежать до угла, присесть, развернуться, выстрелить. Оказалось, что для этого нужно переделать не только интерфейс, но и то, как боец поворачивается, как ищется путь и что бывает, когда в бегущего попадают.
Раунд — это пять секунд
В Terminal Leave нет очков действия. Раунд — это пять секунд общей шкалы времени, и у каждого действия есть длительность. Сейчас это так: шаг пешком — полсекунды на клетку, бегом — треть секунды, ползком — полторы. Сменить позу — 0,4 секунды. Одиночный выстрел — 0,6, прицельный — две, перезарядка — полторы. Выносливость бойца немного ускоряет или замедляет его шаг.
Из этого следует простая арифметика. Пробежать семь клеток, присесть и дать прицельный выстрел — это почти весь раунд. Если пробежать двенадцать, на прицельный выстрел времени уже не останется, только на одиночный. Игрок выбирает не «сколько очков потратить», а что успеть до того, как пять секунд кончатся, зная, что противник в это же время делает свой план.
Время каждого действия назначает сервер. Клиент может показать игроку прогноз, но при разыгрывании раунда сервер всё считает заново по своим правилам и своей карте.
Очередь действий
У каждого бойца есть очередь приказов. Действия добавляются по порядку и выполняются друг за другом: каждое начинается там и тогда, где закончилось предыдущее. Очередь может быть длинной, но всё, что не влезло в раунд, до следующего раунда не доживает.
Выстрел в очереди наводится не на клетку, а на бойца. Если цель за время пробежки сдвинулась, выстрел идёт туда, где она в этот момент стоит. Если она ушла из поля зрения, выстрел не происходит, и время на него не тратится впустую.
Отменять действия можно только с конца. Это ограничение не случайное: каждое следующее действие отсчитывается от того места, где закончилось предыдущее, и если вынуть шаг из середины, всё после него начнётся из неправильной клетки.
Курсор планирования
Первая версия очереди была устроена неправильно. Каждое движение считалось от того места, где боец стоял в начале раунда. План «пробежать три клетки, присесть, пробежать ещё две вправо» не складывался: вторая пробежка начиналась снова от исходной клетки, и боец бежал её в полный рост, хотя перед этим присел.
Поэтому появился курсор планирования. Он стоит не на бойце, а в конце уже заданной цепочки — в той клетке, в той позе и с тем направлением взгляда, с которыми боец окажется после всех предыдущих действий. Следующий приказ отсчитывается оттуда. Кнопки «шаг» и «бег» задают только скорость, а способ движения берётся из позы на курсоре. Присевший и пущенный бегом боец побежит пригнувшись. Лежащий поползёт, быстро или медленно.
Курсор считается по тому, что игрок знает. Если на маршруте окажется препятствие, которого не было видно, сервер остановит бойца перед ним, а остаток плана просто не выполнится. Клиент о скрытом заранее не узнаёт — это часть того же правила, по которому сервер не отдаёт клиенту ничего, чего боец не видит.
Поворот стоит времени
До этого этапа направление взгляда было только картинкой: клиент разворачивал бойца по ходу движения, а для симуляции поворот был бесплатным. Теперь направление — состояние бойца. Оно сохраняется между раундами, боец видит конусом перед собой, а чтобы посмотреть в другую сторону, должен повернуться. Сейчас каждые 45° стоят 80 мс. Разворот кругом — это треть секунды, примерно одна клетка бегом.
Из-за этого изменился поиск пути. Кратчайший маршрут по клеткам не всегда самый быстрый: путь с лишним разворотом может оказаться дольше пути на клетку длиннее. Маршрут теперь ищется по парам «клетка и направление», и цена в нём та же, что в симуляции. Поэтому маршрут, который игрок видит при планировании, совпадает с тем, что потом пробежит боец.
Повернуться можно и на месте, без движения: правая кнопка мыши разворачивает бойца к клетке под курсором. Поворот тратит время раунда, как смена позы.
Попадание на бегу
Если в бегущего попали прицельным выстрелом, он сбивается с шага: на ближайшей клетке останавливается, теряет около трети секунды и бежит дальше. План он не бросает, но до конца раунда успевает пробежать меньше, чем рассчитывал. Выстрел из овервотча действует сильнее — он прерывает движение целиком.
Похожая пауза есть, когда два бойца хотят пройти через одну клетку. Тот, кому клетку не уступили, ждёт и пробует снова, а если она так и не освободилась, останавливается. Двое, которые меняются соседними клетками, просто проходят друг сквозь друга.
Интерфейс
Интерфейс боя собран по нарисованному заранее макету: поле боя на весь экран, вокруг него панели — состояние бойца, отряд, план хода, оружие, действия, мини-карта. Главное в нём — время. У каждого действия в плане показана его цена, а полоса под портретом показывает, какая доля раунда уже занята. Когда она пустеет, план на этот раунд заполнен.
Управление — мышью. Щелчок по земле прокладывает маршрут от курсора планирования. Щелчок по видимому противнику добавляет выстрел в выбранном режиме, а при наведении на него видно примерный шанс попадания. Правая кнопка поворачивает бойца, Backspace отменяет последнее действие. Для сенсорных экранов те же действия продублированы кнопками.
Маршрут строится по щелчку, а не по движению мыши. В первой версии он пересчитывался на каждый пиксель, и поле боя заметно подтормаживало.
Что осталось шероховатым
Шанс попадания при наведении приблизительный и помечен знаком «~». Клиент не знает ловкости противника и всего, что даёт укрытие, поэтому считает только по тому, что видно.
Планировать на несколько раундов вперёд можно только движение. Длинный маршрут клиент запоминает и в каждом новом раунде сам отправляет его следующий отрезок, пересчитанный от того места, где боец на самом деле оказался. Для этого клиент должен быть в бою каждый раунд. Стрельбу и наблюдение нужно задавать заново.
И при плотной застройке маршрут не всегда ложится так, как хотел игрок: самый быстрый путь может обойти угол не с той стороны. Тогда его приходится вести по точкам, несколькими щелчками.
Как раунд разыгрывается после подтверждения планов — в статье про одновременные ходы.
