Radius TactiX, прототип

Концепт радиусной тактики добрался до стадии первой демоверсии.

Radius TactiX, прототип

Ранее проект упоминался в обзорах игроконцептов: первая статья , вторая.

Демо

Демо-версия доступна в вёб-варианте (правда декали радиуса не отображаются в браузере) и в виде скачиваемых билдов для linux/windows здесь:

Геймплей

В начальном меню одна кнопка показывает ростер персонажей, где можно выбрать героев в партию - 4 слота внизу. Другая кнопка меняет режим - ростер остаётся перед глазами, но теперь при клике на героя откроется экран экипировки. На экране экипировки пока работает только слот оружия - герою можно выбрать кортик, перчатки или лук. Кортик и перчатки применяются совсем вплотную - радиус 2. Лук имеет дистанцию 15.

Radius TactiX, прототип

У каждого оружия свои параметры атаки - 4 возможных исхода, записываемые, например. вот так: 2/3/3/8. На данный момент эта информация не выводится игроку, но она есть и урон зависит от неё. В то же время, у различных заклинаний базовый урон может быть фиксирован.

Еще на стартовом экране можно выбрать сражение. Карта сейчас одна, но доступны 3 разных набора противников. У них немного разные скорость/атака/здоровье, а также особенности поведения (подробнее эти механизмы разбирал в предыдущей статье). Оказавшись в предсмертном состоянии скелет может бросить свою голову в персонажа и самоуничтожиться. "Тела" персонажей остаются на поле боя и пока что получают урон тоже.

Radius TactiX, прототип

В сражении герой может перемещаться как в реальном времени, но органичен зоной радиуса своего передвижения. Кнопки "radius", "aoe" и "personal" показывают доступные в каждом из этих режимов действия. Действия в радиусе возможны когда цель находится ближе чем указанное число. Для выбора кого-то в качестве цели нужно кликнуть на врагах или прочих союзниках. Помимо атаки оружием герою доступен огненный трюк (дальность 5, 7 урона) и снежок (дальность 10, 5 урона).

Для доступного действия AoE (эффект по области) указан диапазон дальности от героя, в котором его можно совершить. На карте появляется маркер, который можно двигать, если кликнуть в тот момент когда число дальности горит желтым, действие будет сделано. Все цели вблизи маркера будут поражены (если возможно). На текущий момент здесь есть заклинание наносящее 9 урона на расстоянии от 3 до 9.

В персональном режиме герой целит самого себя. На данный момент в качестве персонального действия доступно бесконечное лечебное зелье.

Особенности реализации игромеханик и прочее

Изначально враги и герои двигались по очереди, но затем я реализовал принцип получения хода на основе скорости - у каждого персонажа есть некое значение быстродействия и когда кто-либо получает ход, то все прочие участники сражения получают плюс к своей инициативе равный своему быстродействию. У того, кто получает ход - вся накопленная инициатива сбрасывается в 0. При нажатии на кнопку конец хода - право ходить получит персонаж с наивысшей инициативой на данный момент. Кликая по участникам сражения можно увидеть параметр Init - это и есть текущая накопленная каждым из них инициатива.

Таким образом, персонажи с высоким быстродействием чаще получают ход, пока прочие ждут своей очереди. В Final Fantasy Tactics эта механика была устроена примерно похоже, но со своими нюансами и деталями. Там же фигурировали заклинания, на каст которых герой должен был дополнительно потратить какое-то время - то есть они происходили не мгновенно и маг мог не успеть произнести заклинание или обстановка на поле могла поменяться таким образом, что заклинание промахнулось бы мимо желаемых целей или наоборот, новые цели вошли бы в зону заклинания, пока оно кастуется. В принципе, появляется возможность тоже сделать нечто подобное, при желании.

В плане программирования, этот проект - один из тех случаев, где очень желательно отталкиваться от разнообразной сохранённой даты (по каждому герою с его параметрами, по каждому предмету, и так далее), работая преимущественно с указателями на неё, чем с непосредственно с ней. То есть нужно так всё продумать, чтобы не гонять лишнюю информацию, а она бралась/перезаписывалась разными "потребителями" из централизованного места.

Допустим в окне формирования партии всё работает ещё проще, чем в проектах, что делал ранее - кликая по ячейкам и перемещая героя мы только лишь меняем привязку текущей ячейки к номеру персонажа в дате, вот и всё. То есть, образно говоря, вместо того чтобы таскать стул из гаража в спальню и обратно - записываем в тетрадке, что стул теперь приписан не к гаражу, а к спальне. Или к кухне. Или ещё куда. Но физически он находится именно в гараже и никуда не двигался.

Также по персонажам есть дата со словарями, откуда для удобства подтягиваем промежуточную изменяемую информацию (хитпоинты и так далее) внутрь моделек в сражении, чтобы не ходить за ней далеко. Обратно, в дату персонажа, мы не так много всего будем писать прямо из сражения, плюс что-то можно отправить в конце боя (лишний накопившийся опыт и так далее). Всевозможные полученные героем статусы в сражении тоже можем обрабатывать локально, не забирая информацию по ним из даты и не отправляя её туда (по крайней мере это не Darkest Dungeon).

Конкретные герои и виды оружия имеют свои словари с параметрами. При этом у героя есть массив с данными по его экипировке, то есть параметры оружия не хранятся на самом герое, а мы получим их по соответствующему номеру экипировки.<br />
Конкретные герои и виды оружия имеют свои словари с параметрами. При этом у героя есть массив с данными по его экипировке, то есть параметры оружия не хранятся на самом герое, а мы получим их по соответствующему номеру экипировки.

Некоторый минус полномасштабного перехода на работу с указателями - становится сложнее отлавливать какие-то баги в механизме, когда указатели проходят череду преобразований (когда абстракция внутри абстракции ссылается на обёртку от другой абстракции и всякое такое). Так что это тоже не панацея и нужно подбирать места, где это подходит лучше, а где нет. Допустим, почему в ранних проектах такое требовалось редко - когда в том же простом инвентаре тебе нужно переместить предмет, ты просто меняешь номер картинки у спрайта одной ячейки на спрайт другой и у тебя нет проблем. Указатели особо не нужны.

С другой стороны, когда перемещать приходится уже не картинку, а много данных связанных с ней (причём не фиксированных, как в диаблоиде - рандомный предмет с префиксами, зарядами и так далее) , то есть картинка уже не определяет предмет полностью - тут приходится именно физически перемещать данные. Указатели уже могут частично помочь, но скорее дополнительно осложнят дело в этом случае, так как тут мы ушли в другую крайность - генерируемые предметы с уникальными данными.

Если же у нас предметы сложные, но сами по себе фиксированные - то тут уже и пригождается практика более плотной работы с указателями на их дату.

Дополнительный плюс - в дату можно заранее отправить все те штуки, которые приходится дополнительно выяснять в процессе. Например, если у нас игра переведена на несколько языков, то в дату того же предмета мы забиваем вместо какого-нибудь Name : Меч, массив наименований - Name : [Меч, Sword, ...] И теперь когда нам требуется показать имя этого предмета, то мы выводим в интерфейсе не Name, а Name [chosen_language], где переменная chosen language будет содержать номер установленного в настройках языка, когда мы к этому Name обратимся. То есть, если русский язык начальный, то Name[0] даст "Меч", а если мы переключим его на первый, английский, то Name[1] даст Sword и так далее.

Что касается экрана экипировки - был некий соблазн сохранить уже запрограммированную внутри легаси-основы этого прототипа концепцию инвентаря с перетаскиванием предметов. Поначалу решил оставить и добавил дополнительные кнопки для переключения текущего слота, но это просто менее удобно и к тому же я спрогнозировал, что это решение ведёт к непростым ситуациям в дальнейшем.

Поначалу предметы перетаскивались мышью, и, чтобы не рушить это - мне пришлось завести отдельные переключатели категорий сверху, которые к тому же не давали бы переместить предмет в другие слоты верхней линии. Но я пожертвовал ненужным перетаскиванием...<br />
Поначалу предметы перетаскивались мышью, и, чтобы не рушить это - мне пришлось завести отдельные переключатели категорий сверху, которые к тому же не давали бы переместить предмет в другие слоты верхней линии. Но я пожертвовал ненужным перетаскиванием...
Текущий вид, где всё работет просто - сверху кликаем на слот экипировки (пока работает только самый левый, оружие) и открывается лист именно этой категории. Затем кликаем по любому варианту и его картинка появляется в слоте - экипировано.<br />
Текущий вид, где всё работет просто - сверху кликаем на слот экипировки (пока работает только самый левый, оружие) и открывается лист именно этой категории. Затем кликаем по любому варианту и его картинка появляется в слоте - экипировано.

Например, даже если игрок может получить только до 2-3х экземпляров каждого конкретного предмета максимум - может случиться так, что общая вкладка предметов этой категории целиком забита (игрок не распихал это всё по персонажам) и новый некуда класть. Придётся писать интерфейс для "места не хватает, не берём предмет или выберите, какие предметы удалить" или что-то в этом роде, и даже так будет немного грустно лишний раз что-то терять по недогляду. Допустим, в том же FFT инвентарь безразмерный, а вот ростер доступных персонажей ограничен - если приходит новый персонаж, то в какой-то момент нужно выгонять старых (в оригинальном Тактиксе это всё ещё и усугублялось постоянно плодящимися монстрами, быстро забивающими ростер, стоит их только взять).

В консольных "бесконечных" инвентарях тоже были свои проблемы, но чаще всего связанные с тем, что долго листать до нужного предмета. Но сам концепт неплохой, просто я хотел сделать его на ПК более наглядным - сделать вкладки категорий и чтобы все предметы там присутствовали в виде иконок. При этом, чтобы количество разных наименований предметов не выходило бы за пределы всех ячеек, чтобы и листать ничего не нужно было. А если их слишком много, то тут можно предусмотреть переключение между несколькими листами внутри одного слота экипировки.

Upd.: кроме вёб-версии добавлены скачиваемые билды.

44
4 комментария

Выглядит неплохо, но текст совсем не завлекает. Это понятно разрабу, а со стороны читаешь, и вроде как все в кучу свалено.

Я и не собирался никого завлекать. Просто сообщаю, что собрал демо и рассказываю технические подробности реализации, пока про них помню.

1