Способы передвижения в парсерных играх

Перемещения между локациями — основное действие в любой текстовой игре, парсерной или менюшной (разве что кроме однокомнатных).
Но если в менюшной игре для перемещения ГГ в другую локацию достаточно одного ЛКМ по кнопке, в парсерных играх всё гораздо интереснее.

Давайте для начала классифицируем все команды, которые может ввести игрок.
Все ниже перечисленные команды при удачном выполнении приводят к перемещению в другую локацию:
  • Перемещение в указанную локацию: иди в дом; иди на площадь; иди к забору. Вполне логичные команды — куда хочу, туда и иду. Для успешного выполнения в игре должны присутствовать локации «в_доме», «на_площади», «у_забора».

  • Перемещения по сторонам света: юг, север, восток, вверх, вниз — самые типовые команды. Именно их опытный игрок будет вводить в первую очередь. И именно их же начинающий никогда не введет самостоятельно без подсказки. Для успешного выполнения, как минимум, должна существовать локация в указанном направлении от текущей.
    Также будет неплохо, если игра понимает и другие варианты: иди на север; или просто на север.

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

  • Движения внутрь и наружу. войди (вбеги, влети), выйди (выбеги, вылети). Действия основаны на представлении о вложенности пространств. Чтобы эти команды работали, необходимо описать в игре соответствующие отношения между локациями.

  • Направления влево, вправо, вперед, назад. Тут есть 2 варианта:
    1. Если в описании локации зафиксировано положение ГГ: «Ты стоишь перед зданием мэрии. Слева от тебя библиотека, направо порт». В этом случае в локации достаточно привязать эти действия к сторонам света.
    2. Если положение ГГ свободно, тогда «назад» означает возвращение в предыдущую локацию, «вперед» — движение в сторону, противоположную предыдущей локации, налево и направо также динамически пересчитываются в стороны света. Для выполнения этих команд нужно помнить локацию и сторону света, откуда мы пришли. 2й вариант не столь однозначен для игрока, но у него всегда должен быть выбор из всего спектра возможных команд.

  • любое произвольное действие, приводящее к перемещению в другую локацию: нажатие кнопки, заклинание телепортации, проглатывание синей таблетки. Все что нужно автору, имеет право быть. Но понятно, что подобные действия завязаны на сюжет, и никак не могут быть стандартизированы. Их реализация — дело автора.

ИТОГО: получается 6 классов команд. Если кто знает больше, обязательно напишите, возможно я что-то упустил.

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

Платформа ТОМ поддерживает карту локаций. Каждая локация позиционируется в системе координат X, Y, Z. По умолчанию между соседними локациями всегда есть проход. Этот проход можно перекрыть, установив «стену» в локации. Проход можно также перенаправить в другую локацию, если это необходимо (например, выход в окно 2-го этажа приведет во двор уровнем ниже).
Для проверки перемещения есть специальная системная команда: check <локация>. Команда проверяет возможность прохода между локациями по карте и вызывает дополнительные проверки, реализованные как методы текущей локации.
Проверки-методы в локации контролируют выполнение условий, необходимых для перехода.
Системная команда goto <локация> осуществляет безусловный переход в локацию.

Всё это в целом создаёт минимально необходимый функционал для перемещений в игре.

P.S. Вышеописанное актуально для версии 2.a.4.4 и выше.
P.P.S. На текущий момент поддерживаются все виды команд, за исключением влево, вправо, вперед, назад.

6 комментариев

Peter
Отличная статья! От себя могу написать, что работая с МП получил примерно такие же классы: Walk, WalkIn, WalkOut. Правда у меня эти классы не так сильно связаны с контекстом (в итоге их как бы меньше, хотя суть такая же). Грубо говоря: «перемещение посредством какого-либо предмета» это тот же Walk или WalkIn но только на предмет (а не на комнату, которая все равно такой же объект).

Стороны света сделаны отдельно, но все-равно в итоге сводится к событию Walk у комнат. Только есть еще обработчики n_to, s_to, ne_to итд. Причем стороны света это условность, в том смысле что можно создавать любые альясы и методы — право/лево итд…
johnbrown
Остаются еще невербальные команды, прижившиеся в MUD'ах, но практически не используемые в ИЛ: стрелки на цифровой клавиатуре. По мне, так очень удобно.
realsonic
В «Спелеологе» в интерфейсе есть стрелки. ;) Правда, они нажимаются мышкой и просто вводят команды перемещений.
ASBer
Забиндить стрелочки на команды перемещений по сторонам света не трудно, но надо ли?