BQL

Материал из Space Station 14 Вики

Перевод BQL

BQL - язык запросов выборки игровых сущностей для использования в команде forall.

Команда forall доступна для администраторов с +QUERY и используется для выборки всех игровых сущностей, которые удовлетворяют заданным пользователем условиям. Команда выглядит так:

forall QUERY do COMMAND

Не совсем ясно, что означает "B" в BQL. Кто-то предлагал расшифровывать первую букву как "bad', "badmin" или "better"

Запросы

Запросы выбирают/отфильтровывают все игровые сущности игры по определённым заданным критериям.

Возможно задание нескольких условий для выборки. Например, взрыв всех живых существ, названных "Urist McHands":

forall alive named "Urist McHands" do invokeverb self $ID Explode

  1. alive - фильтр, выбирающий все живые игровые сущности;
  2. named "Urist McHands" - фильтр, выбирающий все игровые сущности, названные "Urist McHands".

В любой игре очень много сущностей, поэтому помните:

  • BQL по умолчанию применяется ГЛОБАЛЬНО. Каждый запрос начинается с выборки абсолютно всех сущностей. Если вам нужны сущности только определённой сетки, то используйте фильтры ongrid или onmap.
  • Не все запросы выполняются одинаково быстро. Лучше всего начинать перечисление условий выборки с фильтра with <comp или любого другого фильтра, который наиболее точно находит искомое (наподобие tagged, mindful или alive), так как этим фильтрам не нужно проверять каждую сущность в игре на соответствие условиям. Будьте точны: используйте фильтры так, чтобы они выбирали как можно меньшее количество сущностей. Вы же не хотите, чтобы из-за вашей попытки сделать из каждого мыла разумное существо, сервер тормознулся на несколько секунд?

Запросы движка

Данные фильтры предоставляются RobustToolbox'ом (движок, на котором сделана ss14) и доступны во всех играх, которые сделаны на нём:

  • not можно поставить перед любым запросом, если только not не инвертировано себя само;
  • with X выбирает все сущности с компонентом X;
  • named X выбирает все сущности с данным именем X с помощью регулярных выражений (^ и $ вставлены автоматически?);
  • ? parentedto выбирает все сущности, которые являются родительскими по отношению к данной сущности;
  • ? rparentedto выбирает все сущности, которые являются по отношению к данной сущности, даже если косвенно;
  • children выбирает все сущности, которые являются дочерними к данной;
  • rchildren выбирает все сущности, которые являются дочерними к данной рекурсивно;
  • parent выбирает все сущности, которые являются родительскими к данной;
  • prototyped выбирает все сущности, базирующиеся на данном прототипе;
  • rprototyped выбирает все сущности, базирующиеся на данном прототипе, даже если косвенно;
  • select выбирает N случайных сущностей или N% сущностей в зависимост от данного аргумента. Не инвертируйте этот фильтр, иначе это выберет все 100%. Считайте, что это как выборка абсолютно всех сущностей, но в кол-ве N.
  • near выбирает все сущности около пользователей (сущности, которые используют BQL) в данном радиусе.
  • anchored выбирает все сущности, которые закреплены;
  • ongrid выбирает все сущности на данной сетке;
  • onmap выбирает все сущности на данной карте;
  • above выбирает все сущности над данном типом тайла.

Запросы SS14

Это дополнительные фильтры, доступные в Space Station 14:

  • tagged выбирает все сущности с данным тегом;
  • mindful выбирает все сущности, за которыми в данный момент закреплён разум;
  • alive выбирает все живые сущности с разумом;
  • hasreagent выбирает все сущности с данным реагентом внутри или где-то еще;
  • apcpowered выбирает все сущности, которые в данный момент запитаны от ЛКП.

Команды

Это именно то, как происходят потрясающие вещи с выбранными сущностями. Это обычные команды из консоли, которые будут запускаться 'на каждую сущность' со следующими подстановками:

  • $ID - ID сущности, с которой происходят манипуляции;
  • $NAME - название сущности, с которой производятся манипуляции;
  • $WX, $WY - глобальные координаты X и Y сущности, с которой производятся манипуляции;
  • $LX, $LY - локальные (относительно родителя?) координаты X и Y сущности, с которой происходят манипуляции;
  • ...

Примеры

  • Зарядить все батареи:
    forall with Battery do setbatterypercent $ID 100
  • Вернуть/реанимировать всех к жизни:
    forall with Mind do rejuvenate $ID
  • Выдать всему, кто зовётся "Walter White" lung cancer:
    forall named "Walter White" do invokeverb self "Lung Cancer"
  • Взорвать всех и каждого (не надо это делать):
    forall with Body do invokeverb $ID "Explode"
  • Удалить все ghost-роли:
    forall with GhostTakeoverAvailable do rmcomp $ID GhostTakeoverAvailable; rmcomp $ID Mind
  • День полного доступа:
    forall with AccessReader do rmcomp $ID AccessReader
  • Выставить всем игрокам форму мима:
    forall with Mind prototyped MobHuman do setoutfit $ID MimeGear; rmcomp $ID Speech
  • Объявить минуту молчания:
    forall with Humanoid do addreagent $ID chemicals MuteToxin 30