Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Идеи (разгрузка)
» Язык управления игрой
» Структуризация бинарных файлов

Использование материалов
Заметка #28
22 ноября 2007

Язык управления игрой


    Основные положения
    В данном случае понимается игра, близкая по жанру к RTS. Основное отличие состоит в том, что для управления юнитами нельзя использовать мышь или клавиатуру. Все управление производится через консоль путем ввода команд. Например, «построить склад», «атаковать противника» и т.д.
    Мышь может быть использована только для навигации по карте.

    Юниты
    Под юнитом понимаются здания, люди и прочие сущности. Т.е. все то, что можно создавать и чем можно управлять. Условно их можно разделить на четыре категории: здания, рабочие, военные и разведчики. Особое значение приобретают последние. Разведчик умеет подслушивать команды, которые отдаются врагу. Причем команду он слышит в том случае, если в радиусе его действия находится юнит противника, которому эта команда предназначена, а так же все команды общего назначения (например, переименование юнита).
    В некоторых RTS-играх есть разведчики, но их роль сводится только в присутствии в заданном месте и обозревании местности согласно радиусу их видения. В данном же случае, если разведчик перехватил команду, появляется возможность узнать о действительных планах врага, а не только о его локальных перемещениях. Поэтому, некоторые конструкции языка (процедуры, триггеры, планы) должны иметь особенности в соответствие с этим введением.

    Команды и профиль
    Язык команд должен относиться к языкам четвертого поколения. Т.е. высокоуровневый язык, приближенный к естественному. Так как русский язык достаточно сложен для разбора в плане словоформ, то наилучшим языком, взятым за базовый, будет английский. Вот несколько команд, чтобы было примерно ясно, о чем идет речь:
    select archers – выделить всех стрелков (видимых на экране);
    view archer1 – перейти в место на карте, где находится archer1;
    worker1: build factory in CH34 – задание рабочему worker1 построить завод в квадрате CH34;

    Помимо языковых конструкций команда может предваряться статусом: некоторое слово или группа слов, после которой следует двоеточие. Например:
    important: ... – команда с данным префиксом сообщает, что данное задание очень важно. Данное задание не может быть заменено другим заданием без статуса important. Вернее оно запоминается в работах юнита, но будет выполнено после.
    secret: ... – команда будет не видна разведчикам противника (секретный канал передачи), но данный статус будет работать не всегда, а например не более одного раза в две минуты.
    Наравне с высокоуровневым языком должен присутствовать также структурный язык с элементарными операторами: условия, циклы, заведение переменных и прочее. Такой язык позволит более гибко управлять действиями юнитов. Например, заставить юнита бежать, когда его энергоресурс падает ниже какого-то значения.
    Профиль это файл, в котором лежат настройки игрока: готовые процедуры, словари, триггеры и прочее. При старте игры происходит запуск команд профиля и перемещение всего остального в игру.

    В связи с тем, что управление целиком ложится на консоль, наибольшую важность приобретают имена (также наименования) и ориентиры.

    Имена
    Важность имен и наименований несомненна для возможности обращения.
    При появлении, новый юнит сразу получает имя. Если давать уникальное имя внутри класса, то обращение будет не удобным. Например, «archer Alex». Чтобы не писать два слова имя должно быть вообще уникальным.
    Для соблюдения уникальности придется заводить словарь. Причем словарь может быть заменен в профиле. Если словарь иссякает, то имена присваиваются в соответствии с классом. Например, «archer15». Причем индекс после имени берется не по порядку, а случайным образом. Это нужно для борьбы с разведчиками.
    При столкновении с противником, последним также присваиваются имена. Т.е. реального имени единицы противника мы не знаем, но нам нужно иметь возможность влиять (нападать, избегать и т.д.). А так как нет реального имени, то имена в перехваченных разведчиками командах, теряют смысл и требуются дополнительные усилий для понимания команд.
    Союзники имеют возможность обмениваться информацией, поэтому им видны реальные имена.
    Ну и естественно, должна быть команда переименования, как своей единицы, так и единицы противника. В последнем случае может пригодиться, если увидено соответствии между единицей противника и наименованием в перехваченной команде.

    Ориентиры
    Ориентиры нужны для указания места выполнения команды.
    Будет строиться местность проектировщиком или будет генерироваться специальным алгоритмом, в любом случае карта будет состоять из типичных кусков дополненных некоторыми объектами. Имена задаются из словаря, и должны различаться для разных лагерей. Это то же своего рода шифрование команд. Если несколько типичных кусков (например, сегменты леса) стоят впритык друг к другу, то имя дается их объединению. Если таких кусков слишком много, то происходит разделение объединения на территории, иначе сложно будет ссылаться. Причем разделение происходит только в рамках некоторой нации. Т.е. граница на однородной территории для разных наций может пролегать в разных местах.
    В приделах поселения ориентирами могут быть постройки и сущности. За пределами поселения таких ориентиров нет, поэтому вся карта бьется на квадраты, которым даются индексы (например, QR18). Размер квадрата подбирается экспериментально, в основном в зависимости от масштаба построек. Если требуется указать более точное положение, можно дать команду разбить квадрат на заданное количество частей (для четырех - QR18a, QR18b, QR18c, QR18d). Разбивать также можно именованные области. В этом случае разбиваются все квадраты, которые пересекаются с заданной областью. Это может стать полезным для приготовления площадей перед постройкой зданий, либо перед боем, если требуется более точное управление армией.
    Для ориентира можно создавать маркеры.
    create marker <имя> – создать маркер с заданным именем.
    Положением маркера будет являться среднее геометрическое от положения всех выделенных юнитов. Если выделен один, то соответственно на его месте.
    Последним способом ориентирования являются стороны света (восьми достаточно). В отличие от конкретного места, это направление. Можно дать команду разведчику исследовать местность в юго-западном направлении. Второй способ использования это уточнение места относительно некоторого ориентира. Например, «на севере поселения» или «западнее рудника».
    Естественно, все области можно переименовать для большего удобства. В том числе задать имена квадратам.

    Группировка
    Группировка нужна для совместного действия нескольких юнитов. Выделяем несколько юнитов какой командой? Правильно, «select». По умолчанию выделяется всё, что расположено на экране (видимая область). Задав класс(ы) можно выделять только нужное (select archers). Для выделения нескольких пишем их через запятую. Если нужно сделать добавление к выделенным, можно использовать слово «selected».
    select selected, archers – добавить стрелков к уже выделенным;
    Частица «from» позволяет выбрать ориентир, в котором будет выделение.
    select from colony – выбрать всех, кто в данный момент находится в поселении.
    select archers from world – выбрать вообще всех стрелков.
    Команда «create group» задает имя группы, куда будут присоединены выделенные. При этом если такая группа уже была, то она замещается. Если нужно добавить юниты к имеющейся группе, то при выделении можно упомянуть группу:
    select group1, archers
    Если для «create group» задать ключевое слово «from», то в группу будут добавлены не выделенные, а те, кто перечислен после слова.

    Планы и процедуры
    План это заданный набор команд, который может быть вызван просто по имени плана («plan B»). План может готовиться заранее в профиле, либо писать по ходу игры. Например, если в ближайшем будущем понадобиться сделать несколько действий одновременно, но эти действия в данный момент неактуальны.
    При запуске плана, разведчики врага могут узнать только непосредственно команду, запускающую план. Содержимое плана остается неизвестным. Следовательно, должно быть ограничение на количество планов, а также между созданием плана (или коррекцией) и его исполнением должно проходить определенное количество времени, которое должно зависеть как-то от объема плана. Скорее всего, будет зависеть от количества инструкций плана и количества инструкций всех процедур, которые могут быть задействованы во время выполнения плана.
    Также должен быть «открытый план». Это план, который можно выполнить сразу после создания, но он становится видимым для врагов.
    Редактор планов должен быть отдельно от основной консоли.
    Отличие процедуры от плана состоит в невозможности ссылки в процедуре на конкретные имена. Если следует что-то сделать с конкретным юнитом, то его имя должно передаваться в процедуру как параметр. Такая логика необходима для возможности работы разведчиков и исключения написания процедур в качестве планов. Также, в процедуре нет возможности использовать предопределенные множества (world, village и прочее). Но их можно передавать в процедуру через параметры.
    Синтаксис процедуры описывается по правилам высокоуровневого языка. Например:

create command (
  
$unit:unit make $count:integer towers in $place:location
)
begin
  
...
end;

    В процедуре есть возможность использовать локальные переменные. Также есть возможность использовать переменные, привязанные к юниту. Такие переменные сохраняются на протяжении всей игры или до смерти юнита. Например, можно хранить состояние выполнения задания. Синтаксис такой:

   $unit.myvar

    Если myvar это юнит, то мы можем обратиться к переменным данного юнита исключая переменные, ссылающиеся на другие юниты. Это не позволит создавать связанные списки юнитов (у одного ссылка на второго, у второго на третьего и т.д.). Напоминаю, что в процедуре можно оперировать только юнитами, переданными ей в качестве параметра. Т.е. чтобы в переменную занести ссылку на юнит, нужно в процедуру через параметры передать оба юнита. Соответственно, об их «связи» станет известно врагу (при наличии разведчика).
    По поводу связанного списка. С ним можно все же оперировать за счет вызова из процедуры другой процедуры с параметром из переменной. Но в этом случае вызов будет расцениваться как команда, и он будет виден противнику.

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

    Синонимы
    Синонимы предназначены для создания эквивалента имеющегося слова. Причем синонимы могут быть как для имен, так и для команд. Т.е. в принципе, на основе синонимов можно создать еще один язык, непонятный разведчикам противника. Либо это позволит сократить написание некоторых слов. Например, вместо «select» можно будет ввести просто «s».
    Вторая причина введения синонима также связана с разведчиками. Смена имени не всегда возможна из-за присутствия старого имени в плане. Поэтому, в данном случае, синоним является хорошей заменой смены имени с сохранением работоспособности плана.

    Мелочи
    1. Часто, скорость ввода команд, особенно во время боя, будет играть важнейшую роль. Во время ввода могут возникать орфографические ошибки. Поэтому нужно ввести механизм нечеткого сравнения, который позволит находить наиболее близкие слова и тем самым сохранять работоспособность введенного.
    2. Если в команде идет перечисление групп, юнитов, при этом одно из названий либо не существует, либо на основе п.1 его не удалось распознать, команда должна оставаться действующей для всех остальных имен.
    3. Можно опционально добавить режим игры, при котором команды становятся видны противнику сразу (без использования разведчиков). Еще опционально можно отключать работу статуса secret.


© 2005-16, Powered By Digs (Написать письмо, vk)