Список свойств
Ниже идёт список всех свойств (properties) из стандартной библиотеки.
Свойства объекта — это какие-то данные или код, ассоциированный с объектом. Кроме стандартных свойств можно свободно добавлять свои.
n_to
, s_to
, e_to
, w_to
…
Только для комнат. Также есть ne_to, nw_to, se_to, sw_to, in_to, out_to, u_to и d_to.
Соответственно это направления на север, юг, восток, запад, СВ, СЗ, ЮВ, ЮЗ, внутрь, наружу, вверх и вниз.
Значением свойства может быть:
false
(по умолчанию), что означает что выхода нет;- строка, которая пояснит игроку, почему выхода в этом направлении нет;
- комната, либо дверь, в которую будет вести выбранное направление из текущей комнаты;
- процедура, которая вернёт что-либо из выше перечисленного.
Object At_Top_Of_Small_Pit "Над колодцем"
with description
"Прямо из ваших ног находится колодец, буквально дышащий белым туманом.
В этом месте проход на запад кончается, если не считать очень узкую трещину.^
Грубые каменные ступени дают возможность спуститься вниз.",
e_to In_Bird_Chamber,
w_to "Трещина слишком узка, чтобы в нее протиснуться.",
d_to
[; if (large_gold_nugget in player)
{ deadflag=1;
"Вы достигли дна колодца быстрее, чем сами хотели,
и лежите там со сломанной шеей.";
}
return In_Hall_Of_Mists;
],
...
add_to_scope
Если текущий объект находится в области видимости (scope), то все объекты, перечисленные в этом свойстве, тоже попадут в область видимости. Если делать это через процедуру, то она должна вызвать PlaceInScope(объект)
, чтобы поместить объект
в область видимости.
article
и articles
Артикли для объектов. В русской версии не требуются.
after
Сюда попадают все действия после того, как они произошли, но ещё до того, как об этом было сказано игроку.
Для объекта: все действия, происходящие с данным объектом.
Для комнаты: все действия, происходящие в этой комнате.
Если код вернёт false
, выполнение продолжится, и выведется текст о том, что произошло. Если true
, то выполнение на этом остановится, текста выведено не будет.
Так можно заменить текст стандартных реакций на свой:
Object -> RustyDoor "ржав/ая железн/ая двер/ь"
with name 'больш' 'ржав' 'железн' 'двер' 'петл',
...
after
[;
Open: "Дверь отворилась с жутким скрипом и дождем из осыпающейся ржавчины.";
],
has static door locked female;
Или, например, сделать что-то дополнительное к действию:
Object top_of_tree "На верхушке дерева"
with description "На этой высоте цепляться за ствол уже не так удобно.",
d_to clearing,
after [;
Drop:
move noun to clearing;
return false;
],
has light;
before
Сюда попадают все действия после ввода команды, но ещё до того, как они произошли.
Так можно перехватить действие и объяснить игроку, почему оно невозможно, или выполнить какую-то другую логику.
Для объекта: все действия, происходящие с данным объектом.
Для комнаты: все действия, происходящие в этой комнате.
Если код вернёт false
, то выполнение продолжится. Если true
, то выполнение на этом остановится (действие не произойдёт).
Treasure -> "персидск/ий ков/е/р/"
with name 'персидск' 'ковер' 'ковр',
before
[; Take: if (Dragon in location)
"То, что на ковре развалился здоровенный (и весьма свирепый) дракон,
немного мешает реализации этой привлекательной идеи.";
],
...
cant_go
Свойство для комнаты, содержащее строку, либо процедуру, которая выведет строку при попытке пойти в несуществующем направлении. По умолчанию: «Этот путь недоступен».
Object before_cottage "Перед домом"
with description
"Ты стоишь около избушки, на восток от которой раскинулся лес.",
e_to forest,
cant_go "Единственный путь ведет на восток.",
has light;
capacity
Для container
или supporter
-объектов — максимальное количество объектов, которые в или на объект можно поместить. По умолчанию — 100. Для игрока — максимальное количество объектов, которое можно удержать. Для изначального игрока (selfobj
) это значение выставляется через MAX_CARRIED
.
daemon
После активации через StartDaemon(объект)
, эта процедура будет вызываться один раз каждый ход до тех пор, пока не будет остановлена через StopDaemon(объект)
.
Это хорошо подходит для моделирования NPC, автономных систем, механизмов и т.д.
Object -> Bear "огромн/ый пещерн/ый медвед/ь"
with ...,
daemon [;
if (location==thedark) rfalse;
if (self in location) {
if (location==At_Breath_Taking_View)
"^Медведь у Вас за спиной восторженно взревел!";
rfalse;
}
move self to location;
"^Медведь неотступно следует за Вами.";
],
...
describe
Вызывается перед тем, как объект будет выведен в комнате. Если это свойство задано у комнаты, то вызывается перед выводом описания комнаты.
Если describe
вернёт:
false
, то выполнение продолжится, и выведется стандартное описание.true
, то на этом выполнение остановится, дальнейшего вывода текста не будет.
Treasure -> "персидск/ий ков/е/р/"
with name 'персидск' 'ковер' 'ковр',
...
describe [;
if (Dragon in location)
"Дракон лежит на роскошном персидском ковре!";
"Пол пещеры покрыт роскошным персидским ковром.";
],
...
description
Для объекта: описание объекта, которое выводится при осмотре объекта игроком.
Для комнаты: описание комнаты.
Описание может быть строкой или может быть сгеренировано процедурой.
Object hook "маленьк/ий бронзов/ый крюч/о/к/" cloakroom
with name 'маленьк' 'бронзов' 'крюк' 'крючок' 'крючк' 'вешалк',
...
description [;
print "Всего лишь маленький бронзовый крючок для одежды, ";
if (self == parent(cloak)) "с которого свисает черный бархатный плащ.";
"привинченный к стене.";
],
has scenery supporter male;
door_dir
Это свойство должно возвращать направление, в котором ведёт данная дверь. Например, если мост ведёт на восток, то нужно вернуть e_to
.
Object CrystalBridge "хрустальн/ый мост/"
with name 'волшебн' 'хрустальн' 'мост',
initial "Оба края пропасти теперь соединяет хрустальный мост.",
...
door_dir [;
if (location==West_Side_Of_Fissure) return e_to;
return w_to;
],
...
door_to
Это свойство должно вернуть, куда (в какую локацию) ведёт дверь.
Можно вернуть:
false
(по умолчанию), что означает что дверь ведёт никуда;- строка, которая пояснит игроку, почему дверь ведёт никуда;
- объект комнаты, в которую должна вести дверь;
- процедура, которая вернёт что-либо из выше перечисленного.
Object CrystalBridge "хрустальн/ый мост/"
with name 'волшебн' 'хрустальн' 'мост',
initial "Оба края пропасти теперь соединяет хрустальный мост.",
...
door_to [;
if (location==West_Side_Of_Fissure) return On_East_Bank_Of_Fissure;
return West_Side_Of_Fissure;
],
...
each_turn
Текст или процедура, которые будут выполняться (выводиться) в конце каждого хода (после всех демонов (daemons) и таймеров), если объект находится в зоне видимости.
Object branch "надежн/ый толст/ый сук/" top_of_tree
with ...
each_turn [; if (bird in nest && nest in branch) deadflag = 2; ],
...
found_in
Объект будет присутствовать во всех комнатах, перечисленных через пробел в этом свойстве. Если указать не комнату, а обычный объект, то будет присутствовать в той же комнате, что указанный объект.
Так можно удобно моделировать, например, небо, солнце и любые другие объекты, которые должны присутствовать в нескольких местах.
Можно написать процедуру, которая будет это решать. Процедуре нужно оценить переменную location
и вернуть true
, если объект должен присутствовать, или false
в противном случае.
Обратите внимание, что свойство проверяется только в момент перехода из одной комнаты в другую. Также, свойство перестаёт работать для объектов с атрибутом absent
.
Prop "Солдат/ы Гесслера"
with ...,
found_in south_square mid_square north_square marketplace,
has animate pluralname;
grammar
Только для объектов animate
или talkable
. Только для приказов (> Антон, отдай мне бутерброд
). Вызывается тогда, когда парсер определил глагол (verb_word
) и положение глагола в команде (verb_wordnum
) при обращении к кому-то, но ещё не попробовал применить эту грамматику.
Необходимо вернуть один из вариантов:
false
, чтобы библиотека продолжила выполнение;true
, чтобы на этом остановить выполнение и таким образом указать, что ваш код сделал все нужные действия самостоятельно: выставилaction
,noun
,second
;- словарное слово глагола, например
'бр'
(«брать»), чтобы библиотека использовала грамматику этого глагола; - или минус с глаголом,
-'бр'
, чтобы библиотека использовала грамматику этого глагола, а затем ещё и стандартную.
initial
Описание объекта, который ещё не был подобран — то есть изначальное описание в комнате, где он лежит. Это может быть как строка, так и процедура.
Для комнаты такое свойство вызывается или выводится, когда игрок в неё заходит.
Object -> black_rod "черн/ый жезл/ со ржавой звездой на конце"
with name 'черн' 'ржав' 'жезл' 'звезд',
initial "Трехфутовый черный жезл, один конец которого украшает
ржавая железная звезда, лежит у Ваших ног.",
description "Черный жезл длиной в три фута, со звездой на конце.",
...
inside_description
Описание объекта, выводящееся, когда игрок находится внутри него. Такой объект должен иметь атрибут enterable
.
Object -> cage "железн/ая клетк/а"
with name 'железн' 'клетк' 'прут' 'решетк' 'знак',
description
"Символы на клетке таковы: Птица, Стрела, Вепрь.",
inside_description [;
if (self.floor_open)
"Узкая нора в земляном полу клетки открывает путь вниз,
в погребальный колодец.";
"Толстые прутья железной решетки окружают вас со всех сторон.";
],
...
has enterable transparent container openable open static female;
invent
Это свойство позволяет изменять то, как выводится объект в инвентаре.
Оно вызывается дважды:
-
сначала никакой текст в инвентаре про этот объект выведен не был, и
inventory_stage
равно 1.Здесь можно удобно и любым способом изменить вывод текста в инвентаре. После чего нужно вернуть
false
, чтобы продолжить, илиtrue
чтобы на этом закончить. -
затем выведется короткое (обычное) имя объекта, и будет второй вызов, где
inventory_stage
равно 2.Уточняющие детали вида «(открыт)» или «(пуст)» на этот момент ещё не вывелись, и здесь можно вывести свой текст, например «(висит набекрень)».
Здесь аналогично нужно вернуть
false
, чтобы продолжить, илиtrue
чтобы на этом закончить.
Object your_candle "свеч/а"
...
invent [;
if (sin_shadow.evil == true) {
if (self.lit == true) {
print "свеча (горит)"; rtrue;
}
else
print "свеча"; rtrue;
}
if (self.lit == true) {
print "твоя свеча (горит)"; rtrue;
}
else
print "твоя свеча"; rtrue;
],
...
life
Здесь нужно перечислять правила для animate
объектов. Работают они так же, как before
или after
, но только для следующих действий:
Attack Kiss WakeOther ThrowAt Give Show Ask Tell Answer Order
Если код вернёт false
, выполнение продолжится, и выведется текст о том, что произошло. Если true
, то выполнение на этом остановится, текста выведено не будет.
Object cecilia1 "девушк/а"
...
life [;
WakeOther:
if (self.woken == false)
"Ты осторожно толкаешь её, но она спит слишком крепко.";
else
"Не нужно.";
...
list_together
Объекты с одинаковым свойством list_together
будут сгруппированы при выводе в инвентаре или в комнате.
Свойство может быть:
-
числом — все объекты с одинаковым числом группируются;
-
строкой — все объекты с одинаковой строкой группируются;
-
процедурой.
Такая процедура будет вызвана дважды:
- первый раз до вывода текста и с
inventory_stage
равным 1. Здесь нужно вернутьfalse
, чтобы продолжить, илиtrue
чтобы на этом закончить. - второй раз после вывода группы предметов и с
inventory_stage
равным 2. Возвращать значения не требуется.
- первый раз до вывода текста и с
Constant KEYS_GROUP = "ключа";
Object gold_key "золот/ой ключ/"
with name "золот" "ключ",
list_together KEYS_GROUP,
has male;
Object silver_key "серебрян/ый ключ/"
with name "серебрян" "ключ",
list_together KEYS_GROUP,
has male;
Object bronze_key "бронзов/ый ключ/"
with name "бронзов" "ключ",
list_together KEYS_GROUP,
has male;
> ИНВЕНТАРЬ
У тебя с собой есть:
три ключа:
бронзовый ключ
серебряный ключ
золотой ключ
name
Список словарных слов, относящихся к данному объекту. Это именно те слова, по которым игрок обращается к объектам вокруг.
Если такое свойство есть у комнаты, то при обращении будет выведено «Упоминать это в игре нет необходимости».
Если у объекта есть свойство parse_name
, то оно рассматривается в приоритете.
Prop "прилавк/и"
with name 'прилавк' 'ларьк' 'ларёк' 'ряд',
description "Еда, инструменты, одежда — обычное барахло.",
found_in street below_square,
has pluralname;
number
Свойство для произвольного использования, в котором можно хранить любое численное значение. Исторически это осталось со старых версий Информа, сейчас же можно создавать свои собственные свойства для этих целей.
orders
Только для объектов animate
или talkable
. Обрабатывает приказы от игрока вида > РОБОТ, ПОДМЕТИ КОМНАТУ
.
Указанное в приказе действие и объекты, с которым его нужно совершить, будут соответственно в переменных action
, noun
и second
.
Нужно вернуть false
, чтобы продолжить, или true
чтобы закончить.
Object priest "мумифицированн/ый жрец/"
...
orders [;
Go:
"~Нет, мне нельзя покидать Гробницу.~";
NotUnderstood:
"~Говоришь загадками?~";
default:
"~Не твоим приказам я служу, пришелец.~";
],
has animate male;
parse_name
Процедура, которая будет обрабатывать название объекта. Используется для сложных случаев, где name
может быть недостаточно. Вызывается до просмотра name
.
Процедуре следует пройти по всем словам, вызывая NextWord()
. В конце нужно вернуть:
- 0, если введённые слова никак не относятся к объекту;
- -1, чтобы парсер продолжил выполнение и просто использовал список из
name
; - или количество слов подряд, которые подошли.
Object chess_pieces "шахматн/ые фигур/ы" Drawing_Room
has scenery pluralname
with parse_name [ w colour n;
w = NextWord();
if (w == 'белый' or 'черный') {
n ++;
colour = w;
w = NextWord();
}
if (w == 'пешка' or 'ладья' or 'тура' ||
w == 'конь' or 'слон' or 'офицер' ||
w == 'король' || (w == 'королева' &&
(colour == 'белая' || rug hasnt general))) return n + 1;
return 0;
],
plural
Имя объекта во множественном числе. Используется для вывода, только если рядом находятся несколько таких объектов.
Class GoldCoin
with name 'золот' 'монет',
short_name "золотая монета",
plural "золотые монеты";
Object bag "сумк/а"
with name 'сумк',
has container open openable female;
GoldCoin ->;
GoldCoin ->;
GoldCoin ->;
> ИНВЕНТАРЬ
У тебя с собой есть:
сумка (открыта)
три золотые монеты
react_after
Работает так же, как after
, но перехватывает все действия поблизости, то есть все, где этот объект находится в области видимости. Код выполнится после завершения действия, но до того, как об этом было сказано игроку.
Нужно вернуть true
, чтобы на этом закончить, или false
, чтобы продолжить.
Object -> psychiatrist "бородат/ый психиатр/"
with name 'бородат' 'борода' 'психиатр' 'психолог',
...
react_after [;
Insert: print "«Пациент ассоциирует ", (cAcc) noun, " с ",
(cIns) second, ". Любопытно».^^";
PutOn: print "«Пациент кладёт ", (cAcc) noun, " на ",
(cAcc) second, ". Любопытно».^^";
Look: print "^«Представьте, что меня здесь нет».^^";
],
...
has animate male;
react_before
Работает так же, как before
, но перехватывает все действия поблизости, то есть все, где этот объект находится в области видимости. Код выполнится до совершения действия.
Нужно вернуть true
, чтобы остановить действие, или false
, чтобы продолжить.
Object -> gocage "клетк/а"
...
react_before [;
Exit:
if (player in self) {
if (self hasnt open)
"Ты не сможешь выйти из клетки, пока крышка люка закрыта.";
move player to parent(self);
if (keep_silent == 0)
print "Ты сходишь с платформы.^";
rtrue;
}
...
short_name
Альтернативное, расширенное название объекта. Может быть строкой или процедурой. Так можно динамически менять выводимое имя объекта.
Если вернуть false
, то далее выведется оригинальное название объекта. Если true
, то вывод прекратится.
NPC cellar_figure
with short_name [;
if (self.unmasked == true) {
print "Игнат"; rtrue;
}
else
print "фигура"; rtrue;
],
...
short_name_indef
В русской версии не используется.
time_left
Количество ходов, оставшееся до срабатывания таймера данного объекта. Таймер нужно установить заранее через StartTimer(obj)
. Изначальное значение не важно, и оно будет перезаписано запущенным таймером, но свойство тем не менее нужно добавить.
Если значение сейчас равно 0, то таймер сработает в конце этого хода. Если 1, то в конце следующего, и т.д.
time_out
Процедура, код, который надо выполнить при срабатывании таймера. Таймер нужно установить заранее через StartTimer(obj)
. Свойство time_left
тоже необходимо добавить.
Object clock "будильник"
...
time_left,
time_out [;
"^Раздаётся резкий звон будильника.";
],
...
when_closed
и when_open
Для дверей и контейнеров (container
): строка или процедура, описывающие объект в комнате, когда этот объект закрыт или, соответственно, открыт.
Object girlroom_door "двер/ь" girlroom
with name 'щеколд' 'двер' 'деревян',
description "Это простая деревянная дверь, запирающаяся изнутри на щеколду.",
when_open "Дверь на востоке - это единственный выход из комнаты. Сейчас она приоткрыта.",
when_closed "Единственный выход из комнаты - это закрытая дверь на востоке.",
...
when_off
и when_on
Для выключаемых объектов (с атрибутом switchable
): строка или процедура, описывающие объект в комнате, когда этот объект выключен или, соответственно, включен.
Object -> brass_lantern "латунн/ая ламп/а"
with name 'латунн' 'ламп' 'фонар' 'светильник',
when_on "Ваша лампа поблизости испускает яркий свет.",
when_off "Рядом тускло поблескивает лампа из латуни.",
...
has switchable female;
with_key
Для запираемых объектов (с атрибутом lockable
) здесь нужно указать другой объект, который будет ключом для данного объекта. Если указать 0 или nothing
, то подходящего ключа не будет вообще (хотя игроку явно об этом сказано не будет).
Object hatch_lock "зам/о/к/ люка"
with pname 'люк' 'замок' 'замк',
description "Константин хотел убедиться, что братья едят только положенные порции,
и потому настоял на том, чтобы запереть подвал. Он никогда не давал тебе ключ.",
...
with_key cellar_key,
has scenery lockable locked male;