Данный файл является частью Руководства по TADS для авторов игр.
Copyright © 1987, 1996 Майкл Дж. Робертс (Michael J. Roberts). Все права защищены.

Руководство было преобразовано в формат HTML Н. К. Гайем (N. K. Guy), компания tela design.

Перевод руководства на русский язык - Валентин Коптельцев


Приложение B


Стандартные определения для игр

Программа-интерпретатор TADS содержит достаточное количество вспомогательных средств для организации диалогового режима в приключенческих играх, однако не предоставляет никаких определений для игр. Чтобы облегчить задачу авторам игр, в файле adv.t объединены определения для значительного количества базовых объектов и классов, характерных для большинства приключенческих игр. Эти классы носят весьма общий характер, и для большинства игр потребуется их "доводка", однако они позволяют значительно сократить объем рутинной работы при написании игр. В данном разделе описываются эти классы, их назначение и особенности их использования при написании игр.

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

Обратите внимание, что наряду со всеми рассмотренными здесь объектами, в англоязычном файле adv.t также определены артикли "a", "an" и "the" (из русского варианта эти определения по понятным причинам исключены).

Все определения файла advr.t автоматически становятся частью игры при включении этого файла в состав исходного текста игры инструкцией include.


Объекты, классы и функции

В данном разделе в алфавитном порядке перечислены объекты и функции, определенные в файле advr.t.

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

Описания функций содержат информацию о формате вызова функций, их назначении и возвращаемых значениях.


Функции, определенные в оригинальной (англоязычной) версии


_rand

_rand: function(x): модифицированная версия встроенного генератора случайных чисел (функции rand), обеспечивающая более равномерное распределение случайных чисел. Как и прототип, возвращает случайное число в диапазоне от 1 до x (x должен быть положительным целым числом).


addbulk

addbulk: function(list): функция возвращает сумму объемов объектов списка list (объем объекта определяется его свойством bulk). При этом учитываются объемы только самих объектов в списке, а не их содержимого, поскольку подразумевается, что объект не изменяется в объеме, если в него что-нибудь положить. Вы можете легко обойти это соглашение для специальных объектов (например, сумки-авоськи, растягивающейся, когда в нее что-либо кладут), определив для них свойство bulk в виде метода, учитывающего изменение объема контейнера при помещении в него других объектов.


addweight

addweight: function(list): функция складывает веса объектов, содержащихся в списке list, и возвращает полученную сумму. Вес объекта определяется его свойством weight. Данная функия учитывает веса содержимого объектов из списка, а также веса содержимого этого содержимого и т. д.


checkdoor

checkDoor: function(d, r): используется для проверки состояния двери d. Если эта дверь открыта, функция возвращает комнату r, не выводя никаких сообщений. Если же дверь закрыта, то выводится сообщение о том, что дверь закрыта, и функция возвращает nil.


checkreach

checkreach: function(loc, actor, v, obj): проверяет, может ли актер (персонаж) actor манипулировать объектом obj при помощи глагола v, находясь в комнате loc. Функция используется на этапе валидации (проверки корректности) команды. Эта функция разрешает дальнейшую обработку команды, если obj - это объект специального типа (numObj или strObj), если этот объект находится в инвентаре актера actor, а также в том случае, если он внесен в список reachable комнаты loc. Во всех прочих случаях возвращается выводится сообщение об ошибке, что на этапе валидации автоматически означает отказ от дальнейшей обработки.


incscore

incscore: function(amount): добавляет значение amount к общему числу набранных игроком очков, которое хранится в свойстве global.score. Всегда используйте эту процедуру вместо прямого изменения значения свойства score объекта global, поскольку incscore также обеспечивает обновление строки статуса при изменении счета.


initRestart

initRestart: function(parm): устанавливает флаг, указывающий на то, что произошел перезапуск игры (игрок дал команду RESTART). Это позволяет при желании обрабатывать такую ситуацию особым образом; например, если в игре имеется длинный вводной текст, то при ее перезапуске его можно будет опустить, чтобы не утомлять игрока.


initSearch

initSearch: function: инициализирует контейнеры объектов, для которых определены свойства searchLoc, underLoc или behindLoc путем занесения этих объектов соответственно в списки searchCont, underCont и behindCont контейнеров. Для правильной инициализации контейнеров эту процедуру следует вызывать один раз в начале игры (из функции preinit или init - на усмотрение автора).


inputline

inputline: function: данная функция является "оболочкой" для встроенной функции input, служащей, в свою очередь, для ввода текста пользователем. В режиме HTML функция inputline обеспечивает переключение шрифта на тот, который используется при вводе команд игроком. Вследствие этого все вводимые игроком символы, считываемые при помощи этой функции, печатаются на экране стандартным шрифтом для ввода команд. Функция возвращает строку, введенную пользователем (игроком).


isIndistinguishable

isIndistinguishable: function(obj1, obj2): возвращает true, если объекты obj1 и obj2 считаются неотличимыми друг от друга при анализе списков объектов. Если два объекта признаны неотличимыми, то функции, выполняющие анализ и вызов списков (например, такие, как itemcnt, listcontgen и т. д.) считают их, как один объект, и выводят их в списке (или учитывают при вычислении количества элементов списка) только один раз. Объекты признаются эквивалентными (функция возвращает true), если у них обоих свойство isEquivalent определено равным true, для них совпадают прямые родительские классы (т. е. классы, непосредственными наследниками которых являются эти объекты; проще говоря, это те классы, которые присутствуют в заголовке определния объекта (типа object: class)), а также значения основных свойств (в стандартном варианте функция анализирует свойство isworn, а также комбинацию свойств (islamp and islit), однако при необходимости можно добавить и другие свойства).


itemcnt

itemcnt: function(list ): возвращает количество "отображаемых" объектов в списке list. Объект является отображаемым, если для него определено свойство isListed, равное true. Эту функцию удобно использовать, чтобы определить, сколько всего объектов будет перечислено в описании комнаты.


listcont

listcont: function(obj): данная процедура выводит содержимое объекта obj в виде списка, разделенного запятыми. Задача отображения вводной конструкции перед списком (например, фразы типа "в коробке лежат"), а также завершения списка (обычно точкой) возлагается на функцию, вызывающую listcont. Объект выводится в списке только в том случае, если его свойство isListed имеет значение true. Если в списке имеется несколько неразличимых объектов (см. функцию isIndistinguishable), они выводятся только один раз (с указанием их количества). См. также listcontcont, listfixedcontcont, nestlistcont и showcontcont.


listcontcont

listcontcont: function(obj): процедура выводит содержимое объектов. содержщихся в объекте obj. Список выводится в форме законченных фраз, поэтому открывающего и завершающего текста не требуется. Выводится список содержимого любого объекта, перечисленного в списке contents объекта obj, у которого свойство contentsVisible имеет значение true. Содержимое объектов, для которых определено свойство isqcontainer или isqsurface, имеющее значение true, на экран не выводится. См. также listcont, listfixedcontcont, nestlistcont и showcontcont.


listcontgen

listcontgen: function(obj, flags, indent): это - процедура вывода списков общего назначения. Параметр obj может быть списком - в этом случае процедура просто выводит полученный список - или объектом; в последнем случае выводится список его содержимого. Аргумент flags определяет, каким именно образом должен выводиться список - в столбик или в строчку через запятую, количество отступов при выводе списка нижнего уровня (например, если у нас есть коробка, в которой лежит множество предметов, среди которых - сумка, в которой тоже что-то лежит), а также указывает, до какого уровня следует выводить содержимое объектов, которые находятся в объекте obj. Для этих целей используются предопределенные символы компилятора LCG_TALL, LCG_CHECKVIS и LCG_RECURSE. Параметр indent задает величину отступа. Данная процедура является процедурой "низкого" уровня, поэтому напрямую ее использовать вам, скорее всего, не понадобится. Вместо нее рекомендуется пользоваться следующими процедурами, использующими listcontgen в своей работе: listcont, listcontcont, listfixedcontcont, nestlistcont и showcontcont.


listfixedcontcont

listfixedcontcont: function(obj): выводит содержимое всех объектов класса fixeditem, которые содежатся в объекте obj. Благодаря этой процедуре все объекты, которые игрок может взять, отображаются где-либо в описании комнаты. Эта процедура рекурсивно проходит по "дереву объектов", содержащихся в объекте obj, выводя содержимое каждого из них, перебирая каждую ветвь до тех пор, пока не будет выведен список объектов или ветвь не окажется " "пустой", т. е. не содержащей отображаемых объектов. Список выводится в форме законченной фразы, поэтому никакого открывающего или завершаюего текста не требуется. См. также listcontcont, listcont, nestlistcont и showcontcont.


mainRestore

mainRestore: function(fname): восстанавливает игру из файла с именем fname. При успешном восстановлении возвращает true, при ошибке - nil. При успешном восстановлении игры функция обновляет строку статуса и выводит подробное ("длинное") описание текущей локации. Эта функция используется командой restore. Если вас устраивает стандартная процедура восстановления игры, модифицировать данную функцию в процессе написания игры вам вряд ли понадобится.


nestlistcont

nestlistcont: function(obj, depth): процедура выводит содержимое объекта obj в виде списка в столбик, при этом также отображается содержимое объектов, входящих в этот список. Содержимое объектов из списка будет отображаться только в том случае, если они видимы (грубо говоря, содержащий их объект прозрачен или открыт). Параметр depth определяет наличие отступа при выводе содержимого элементов списка. Если этот параметр равен 1, то список будет выводиться с отступами согласно иерархии; как правило, используется именно такой вывод, однако в некоторых случаях может потребоваться вывод списка без отступов - тогда параметр depth должен быть равен 0. См. также listcontcont, listfixedcontcont и showcontcont.


numbered_cleanup

numbered_cleanup: function(obj): эта процедура используется в качестве запала для удаления объектов, создаваемых классом numberedObject при вызове его метода newNumbered. При создании нового объекта этот метод устанавливает запал, вызывающий настоящую функцию в конце хода для удаления только что созданного объекта. Функция является служебной и вряд ли понадобится при написании игры.


reachableList

reachableList: function(obj): функция возвращает список всех содержащихся в объекте obj объектов, которыми игрок может манипулировать. Это означает, что, если объект-контейнер открыт или является контейнером "без крышки", то функция возвращает содержимое объекта, плюс результат выполнения функции reachableList над каждым из содержащихся в obj объектов; если объект является закрытым контейнером, возвращается пустой список. См. также visibleList.


sayPrefixCount

sayPrefixCount: function(cnt): выводит количество cnt (используется при выводе списков, например, во фразах типа "на столе лежит восемь яблок." Если cnt меньше или равно двадцати, выводит число прописью (например, "восемь яблок"), в противном случае выводит его в цифровой форме ("80 яблок").


scoreFormat

scoreFormat: function(points, turns): данная функция возвращает отформатированную строку, составленную из количества набранных очков (параметр points) и числа затраченных ходов (параметр turns), разделенных наклонной чертой. Эта информация отображается обычно правой части строки статуса. Если вам потребуется отобразить другую информацию, вы можете соответствующим образом модифицировать эту фунцию, чтобы она возвращала строку нужного вам вида. См. также scoreStatus.


scoreStatus

scoreStatus: function(points, turns): эта процедура обеспечивает обновление строки статуса игры. В стандартном варианте отображается число набранных игроком очков (параметр points) и количество затраченных им ходов (параметр turns). Вывод осуществляется средствами встроенной функции setscore(); собственно, по умолчанию scoreStatus содержит только вызов этой функции. Вызов локализован в данной процедуре для того, чтобы автору было легче заменить стандартный формат строки статуса на свой, оригинальный (для этого достаточно будет отредактировать scoreStatus). См. также scoreFormat.


showcontcont

showcontcont: function(obj): процедура выводит содержимое объекта obj, а также содержимое контейнеров и поверхностей (объектов класса surface и container), содержащихся в объекте obj. Список выводится в виде законченной фразы. Это - внутренняя процедура, используемая процедурами listcontcont и listfixedcontcont. См. также процедуру nestlistcont.


switchPlayer

switchPlayer: function(newPlayer): назначает в качестве главного персонажа (за которого играет игрок) нового актера. В данной процедуре используется встроенная функция parserSetMe() для изменения регистрационной записи главного персонажа (далее ГП) в синтаксическом анализаторе, а также производит необходимые изменения объектов, соответствущих текущему и будущему ГП. Во-первых, поскольку по принятым в TADS соглашениям ГП никогда не входит в список содержимого комнаты, где он находится, текущий ГП заносится в этот список, а будущий ГП из него исключается. Во-вторых, слова "я", "меня" и т. д. удаляются из лексических свойств "старого" ГП и добавляются в лексические свойства нового.


turncount

turncount: function(parm): данная функция используется обычно в качестве демона (как правило, инциируемого функцией init), обновляющего счетчик ходов (свойство turnsofar объекта global) после каждого хода. После обновления счетчика (увеличения его на 1) функция осуществляет вызов scoreStatus, чтобы обновить строку статуса.


visibleList

visibleList: function(obj, actor): функция возвращает список всех содержащихся в объекте obj объектов, видимых актером actor. Работает аналогично функции reachableList.


Функции, определенные дополнительно в русскоязычной версии

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


dezyo

dezyo: function(str): заменяет в строке str все буквы "ё" на "е". Используется при предварительной обработке введенной игроком строки до передачи этой строки синтаксическому анализатору.


dToS

dToS: function(obj, prop): преобразует свойство prop объекта obj, которое должно быть заключенной в двойные кавычки строкой, в строку, заключенную в одинарные кавычки. Возвращаемое значение - полученная строка (в одинарных кавычках). Функция предоставлена Майком Робертсом.


ella

ella: function(obj): формирует и выводит окончания невозвратных глаголов в прошедшем времени аналогично функции glsok, однако для анализа вместо передаваемых аргументов используются свойства объекта obj: isHer и isHim интерпретируются аналогично аргументам grod и mrod, а isThem - аналогично аргументу chislo. Значение признака типа глагола (аргумент ca функции glsok) здесь не используется; функция работает так, как если бы этот аргумент был равен 2. См. также функции iao, saas.


glok

glok: function(lico, sprag, type, chislo): функция выводит окончание для глагола в настоящем времени в соответствии с правилами русского языка. Аргументы интерпретируются следующим образом: lico - лицо (1-е, 2-е, 3-е), в котором употребляется глагол; sprag - спряжение глагола (1 или 2); type - указывает, смягчается ли окончание глагола (если смягчается, то type = 2, а если нет - type = 1); chislo - определяет число, в котором употреблен глагол; если в единственном, принимает значение nil, а если во множественном - true. Функция работает верно для всех параметров, кроме единственного числа первого лица("Я").


glsok

glsok: function(ca, grod, mrod, chislo): формирует и выводит окончания глаголов в прошедшем времени в соответствии с правилами русского языка. Аргументы: ca - признак типа глагола, может принимать значения 0, 1 или 2; если этот аргумент равен 0, выводятся окончания типа "и", "а", "о"; когда он равен 1, это означает, что глагол является возвратным (с окончанием "ся"), и формируются окончания "ись", "ась", "ось", "ся"; при значении 2 этого аргумента формируются окончания типа "ли", "ел", "ла" "ло". Аргументы grod, mrod - признаки женского и мужского рода, соответственно (например, для фраз типа "она пошла", "он пошел"), могут принимать значения nil или true; если оба этих признака имеют одинаковое значение (неважно, какое), то это интерпретируется как средний род, и выводится соответствующее окончание; chislo - определяет число, в котором употреблен глагол; если в единственном, принимает значение nil, а если во множественном - true.


iao

iao: function(obj): формирует и выводит окончания глаголов в прошедшем времени аналогично функции glsok, однако для анализа вместо передаваемых аргументов используются свойства объекта obj: isHer и isHim интерпретируются аналогично аргументам grod и mrod, а isThem - аналогично аргументу chislo. Значение признака типа глагола (аргумент ca функции glsok) здесь не используется; функция работает так, как если бы этот аргумент был равен 0 (выдавая окончания "и", "а", "о"). См. также функции ella, saas, yao.


kpstok

kpstok: function(mrod, grod, chislo): функция используется для добавления окончаний кратким страдательным причастиям (типа ОТКРЫТ(А, О, Ы)). Если слово имеет множественное число (аргумент chislo равен true), функция выводит окончание "ы". Если слово имеет единственное число (аргумент chislo равен nil) и мужской род (mrod равен true), то окончания не выводится; для единственного числа и женского рода (grod = true) выводится окончание "а". Наконец, если оба аргумента mrod и grod имеют одинаковое значение (true или nil - неважно), то выводится окончание для среднего рода ("о"). Данная функция является устаревшей, и вместо нее рекомендуется использовать yao.


loweru

loweru: function(oldstr): переводит строку oldstr в нижний регистр. Необходимость в данной функции возникает вследствие того, что встроенные средства TADS не понимают кириллицу, в связи с чем, если данную функцию не использовать, то введенное игроком слово с разными комбинациями прописных и строчных букв (например, "кот", "коТ" и "КОт") будет восприниматься синтаксическим анализатором как разные слова. Поскольку задать ВСЕ возможные комбинации букв для каждого лексического свойства объекта совершенно нереально, остается либо ограничить список допустимых символов, понимаемых игрой, прописными или строчными буквами, либо (что удобнее с точки зроения игрока) использовать такую функцию преобразования. Более подробно о работе синтаксического анализатора см. соответствующий раздел документации.


numok

numok (num, s1, s4, s5): выбирает и выводит одно из окончаний s1, s4 или s5 (которые должны быть строками, заключенными в одинарные кавычки) в зависимости от числа num. Окончание s1 выводится для num = 1, s2 - для num = 2..4, s5 - для num = 5..9, а также 0.


ok

ok (obj, textIfIsThem, textIfIsHim, textIfIsNeuter, textIfIsHer) : универсальная функция вывода окончаний на основании свойства объекта obj. Выводимые окончания определяются остальными четырьмя параметрами (которые должны быть строками, заключенными в двойные кавычки): textIfIsThem выводится, если объект имеет множественное число (его свойство isThem имеет значение true), textIfIsHim - если для объекта определено равным true свойство isHim (признак мужского рода), textIfIsHer - если для объекта определено равным true свойство isHer (признак женского рода), textIfIsNeuter - если объект имеет средний род (он признается таковым, если оба "родовых" свойства isHim и isHer имеют одинаковое значение (неважно, true или nil).


oyay

oyay: function(obj): формирует и выводит окончания прилагательных в первом лице в соответствии с правилами русского языка (типа "ие", "ая", "ой", "ое"). Для выбора нужного окончания используются свойства объекта obj: isThem - определяет число (если оно равно true, то число множественное, если nil - единственное); isHer и isHim, также принимающие значения true или nil - определяют соответственно женский и мужской род. Если оба последних свойства имеют одинаковое значение (неважно, какое), то функция считает, что объект obj - среднего рода.


parseNounPhrase

Данная функция является предопределенной и служит для модификации работы синтаксического анализатора. Подробно ее работа будет рассмотрена в соответствующем разделе.


preparse

Данная функция является предопределенной и служит для модификации работы синтаксического анализатора. Подробно ее работа будет рассмотрена в соответствующем разделе.


preparseCmd

Данная функция является предопределенной и служит для модификации работы синтаксического анализатора. Подробно ее работа будет рассмотрена в соответствующем разделе.


saas

saas: function(obj): формирует и выводит окончания возвратных глаголов в прошедшем времени аналогично функции glsok, однако для анализа вместо передаваемых аргументов используются свойства объекта obj: isHer и isHim интерпретируются аналогично аргументам grod и mrod, а isThem - аналогично аргументу chislo. Значение признака типа глагола (аргумент ca функции glsok) здесь не используется; функция работает так, как если бы этот аргумент был равен 1. См. также функции ella, iao.


yao

yao: function(obj): функция работает аналогично функции kpstok, однако для анализа вместо передаваемых аргументов используются свойства объекта obj: свойство isHim соответствует аргументу mrod функции kpstok, свойство isHer - аргументу grod, а isThem - аргументу chislo.


ZA

ZA: function(str): преобразует первую букву строкового аргумента str (который представляет собой строку, заключенную в одинарные кавычки) в заглавную (это происходит только в том случае, если первый символ str - это строчная буква русского алфавита; для всех остальных символов, в т. ч. для букв латинского алфавита, ничего не происходит), а затем выводит получившуюся строку на экран. Необходимость в данной функции возникает в связи с тем, что встроенная функция caps() не работает с кириллицей. См. также функцию ZAG.


ZAG

ZAG: function(obj, prop): аналог встроенной функции TADS caps() для кириллицы. Меняет первую букву свойства prop объекта obj, которое должно быть строкой, заключенной в двойные кавычки, на заглавную (работает только для строчных букв кириллицы; если первый символ prop иной, то он не меняется), после чего результирующая строка выводится на экран. См. также функцию ZA.


Классы и объекты


Actor

Actor: fixeditem, movableActor. Персонаж в игре. Свойство maxweight определяет максимальный вес (сумму свойств weight всех объектов в инвентаре), а свойство maxbulk - максимальный объем (соответственно, сумму свойств weight), который этот персонаж (или актер) может носить с собой. Метод actorAction(verb, directObject, preposition, indirectObject) определяет реакцию персонажа на команду игрока (по умолчанию персонаж игнорирует команду, при этом выводится соответствующее сообщение). При этом следует учесть, что если при обработке этого метода программа-интерпретатор не встретит инструкцию exit, то, выполнив все указанные в методе действия, команда далее будет обрабатываться как ни в чем не бывало (что, как правило, нежелательно) (см. также описание данного метода для класса thing). Метод isCarrying(object) возвращает true, если предмет object находится в инвентаре персонажа (даже в случае, если персонаж несет контейнер, в котором (с любым уровнем вложений) находится предмет). Метод actorDesc служит для отображения сообщения, что персонаж находится в комнате; это сообщение выводится при отображении описания комнаты. Метод verGrab(object) вызывается при попытке взять какой-либо предмет из инвентаря персонажа; по умолчанию персонажи не отдают то, что у них в руках. См. также определение данного метода для класса thing).

Если требуется, чтобы игрок мог следовать за персонажем (команда "следовать за..."), следует создать объект-"тень" класса follower и установить свойство myfollower персонажа равным данному объекту. При этом объект-"тень" автоматически будет перемещаться за персонажем, отставая от него на один ход, чтобы игрок мог следовать за ним.


basicMe

basicMe: Actor, floatingItem. Реализация по умолчанию для объекта, соответствующего игроку (этот объект, как правило, носит название Me). В файле advr.t определен класс basicMe, а не объект Me, чтобы автор игры мог заменить часть определений по умолчанию, сохранив большую их часть, и не модифицироваь при этом файл advr.t непосредственно. Чтобы использовать класс basicMe в качестве главного персонажа вашей игры без изменений, влючите в код вашей игры следующую инструкцию: "Me: basicMe;".

В классе basicMe определяются все те же методы и атрибуты, что и для прочих персонажей, с указанием соответствующих значений для главного персонажа. Для него определено лексическое свойство noun c указаним различных форм местоимения "я". Свойство sdesc выводит "ты"; соответствующим образом определены также свойства, отвечающие за отображение краткого описания в различных падежах, а также форматные строки. Кроме того, переопределены методы actorAction (чтобы главному персонажу можно было давать команды), travelTo, moveInto и ряд других.


basicNumObj

basicNumObj: object. Данный класс является реализацией по умолчанию для так называемого нумерованного объекта (или объекта-числа) numObj (такой объект используется, например, в качестве значений для объектов класса dialItem в командах вида "установить переключатель на 8"). Атрибут value соответствует текущему числу (в рассмотренной выше команде он будет равен восьми). Чтобы использовать данный класс без изменений, включите в Вашу игру следующее определение: "numObj: basicNumObj;".


basicStrObj

basicStrObj: object. Данный класс является реализацией по умолчанию для так называемого строкового объекта (или объекта-строки) strObj (такой объект используется для представления в вводимых игроком командах строк в двойных кавычках, например, "напечатать "привет" на клавиатуре"). Атрибут value соответствует текущей строке (в рассмотренной выше команде он будет равен "привет"). Чтобы использовать данный класс без изменений, включите в Вашу игру следующее определение: "strObj: basicStrObj;".


beditem

beditem: chairitem. Объект-кровать. В целом аналогичен объекту-стулу (chairitem); единственное отличие состоит в том, что игрок описывается лежащим на объекте, а не сидящим.


behindHider

behindHider: hider. Этот класс аналогичен классу underHider, только предметы скрываются не под, а за "объектом-укрытием". Для спрятанных за объектом данного класса предметов свойство behindLoc должно ссылаться на "объект-укрытие". См. также searchHider.

Объекты, скрываемые посредством объекта класса behindHider, должны принадлежать классу hiddenItem.


buttonitem

buttonitem: fixeditem. Объект-кнопка (нажимаемая). Для объектов этого класса автор игры должен определить собственный метод doPush(actor), обрабатывающий команду "нажать на..." и выполняющий все требуемые действия. Обратите внимание, что для всех кнопок определено лексическое свойство-существительное "кнопка" (его тоже можно переопределить).


chairitem

chairitem: fixeditem, nestedroom, surface. Объект-стул, на котором игрок и другие персонажи могут сидеть. Сидя на стуле, персонаж не может никуда переместиться, пока не встанет, и может манипулировать только объектами, включенными в список, определяемый свойством reachable стула. Обратите внимание, что между стульями и кроватями в стандартном варианте нет сколь-либо значительных различий, и как на стульях, так и на кроватях можно и сидеть, и лежать; единственная разница состоит в выводимом при этом сообщении. См. также beditem.


clothingItem

clothingItem: item. Предмет одежды. По умолчанию, когда игрок одевает на себя одежду, не происходит ничего, кроме того, что атрибут isworn устанавливается равным true. Для реализации каких-либо других эффектов требуется переопределить метод doWear(actor) для данного класса. Кроме того, обратите внимание, что, когда предмет этого класса одет на игрока (или - в общем случае - на другого персонажа), выполнение определенных действий автоматически приведет к тому, что данный персонаж снимет этот предмет одежды (например, если дать команду "бросить предмет"). Чтобы добиться иного порядка обработки таких команд, переопределите метод checkDrop; если вы хотите запретить такие действия над предметом, когда предмет одет на персонажа, включите в метод checkDrop инструкцию exit.


container

container: item. Объект-контейнер, в который можно класть другие предметы. Атрибут-флаг iscontainer установлен равным true. Свойство ldesc для данного класса по умолчанию выводит список предметов, находящихся в нем (если таковые имеются). Атрибут maxbulk определяет максимальный объем предметов (определеяемый как сумма атрибутов bulk всех предметов - см. также класс thing), который можно поместить в контейнер (по умолчанию этот атрибут равен 10). Свойство isopen, определяющее, открыт ли контейнер, здесь установлено равным true (т. е. контейнер не закрывается). См. также класс surface.


darkroom

darkroom: room. Темная комната. Чтобы перемещаться по ней, а также выполнять большую часть других действий, игроку необходимо принести в нее источник света (объект класса lightsource). Обратите внимание, что освещение в комнате можно также включить, установив его свойство lightsOn равным true. Лучше включать освещение именно таким образом, а не установкой свойства islit, поскольку последнее является методом, проверяющим наличие источника света в комнате.


darkVerb

darkVerb: deepverb. Глагол, который "работает" в темном помещении (класса darkroom). К таковым относятся все глаголы перемещения (класс travelVerb), а также системные глаголы (типа "сохранить", "восстановить", "отчет"). Кроме того, к этому классу относится еще ряд глаголов:например, в темноте игрок может бросить что-либо из своего инвентаря, или включить фонарь, который он держит в руках. Атрибут-флаг isDarkVerb, равный для данного класса true, служит дополнительным признаком, что тот или иной объект-глагол принадлежит данному классу.


decoration

decoration: fixeditem. Объект-декорация, не имеющий никакой функции в игре. Соответствующие предметы нельзя взять, подвинуть либо взаимодействовать с ними каким-либо другим образом; их можно только осмотреть. Использование таких объектов способно повысить "играбельность", поскольку позволяет без значительных трудозатрат обеспечить распознавание синтаксическим анализатором всех слов, которые используются в описании комнаты.


deepverb

deepverb: object. "Объект-глагол", к которому обращается синтаксический анализатор, когда игрок введет глагол, соответствующий лексическим свойствам этого объекта, в своей команде. Каждый объект данного класса содержит как список глаголов, ему соответствующих, так и описание допустимого синтаксиса команды. Свойство verb содержит перечисление всех глаголов, при употреблении которых в команде произойдет обращение к данному объекту. Можно использовать как одиночные слова (как, например, 'пройти', так и пару слов (например, 'пройти сквозь'). В последнем случае второе слово может быть перемещено в конец команды (примечание переводчика: это очень актуально для английского языка и менее актуально для русского. Однако и в русском можно придумать команды, для которых это свойство будет проявляться; например, если определить глагол "поднять" и указать в его свойстве verb словосочетание 'поднять наверх', то игра будет понимать как команду "поднять наверх корзину", так и "поднять корзину наверх"). Метод action(actor) определяет реакцию игры, если глагол употреблен самостоятельно (например, игрок ввел команду "осмотреться" или "север"); если данный метод не определен, то глагол не может быть употреблен таким образом. (Аргумент actor - это персонаж, который должен выполнить команду (по умолчанию это главный персонаж, но, например, в команде вида "Бобик, прыгай" в качестве аргумента actor будет передан объект, соответствующий персонажу (Бобику)). Атрибут doAction определяет общий корень названия методов (должен быть заключен в одинарные кавычки), которые будут обрабатывать команду, состоящую из глагола и "прямого" объекта (команды вида "взять камень" или "прыгнуть через забор"). Например, если для некоторого глагола указано определение doAction='Jump', то обработку команды, состоящей из глагола и "прямого" объекта, будут выполнять методы verDoJump и doJump этого "прямого" объекта. Аналогично, атрибут ioAction(preposition) определяет семейство методов-обработчиков для команды вида "глагол-прямой объект-предлог-косвенный объект" (например, "положи тетрадь на стол"). Аргумент preposition - это предлог, употребляемый с данным глаголом. Для одного глагола можно определять несколько атрибутов ioAction, по одному для каждого предлога. Подробнее о роли и порядке работы методов-обработчиков команд см. в разделе Создание собственных глаголов главы седьмой.

Метод validDo(actor, object, seqno) возвращает true, если указанный объект object допустим в качестве "прямого" объекта для персонажа actor. Аналогичным образом метод validIo(actor, object, seqno) возвращает true, если указанный объект можно использовать в качестве "косвенного". Аргумент seqno в обоих случаях - это номер объекта по порядку (начиная с 1-го) (в командах, где требуется обработка сразу нескольких объектов (например, "взять все"). Как правило, этот параметр игнорируется, но теоретически могут возникнуть случаи, когда может потребоваться его анализ. Например, объект askVerb (соответствующий глаголу "спросить") не делает различий между объектами, соответствующими одному и тому же набору лексических свойств, и поэтому обрабатывает только первый объект из общего списка "подходящих" объектов. Как правило, автору игры эти методы (validDo и validIo) менять не требуется; в общем случае они возвращают true, если объект доступен персонажу для манипуляций.

Методы doDefault(actor, prep, indirectObject) и ioDefault(actor, prep) возвращают список, соответственно, "прямых" и "косвенных" объектов по умолчанию. Эти списки используются для определения того, какие объекты имеются в виду, если в команде используется слово "все", а также подбирают подходящие объекты, если игрок вообще не упомянул в своей команде объектов (например, дал команду "отпереть" вместо "отпереть дверь"). Как правило, эти методы возвращают список всех объектов, для которых применима данная команда (т. е. тех, чьи обработчики-верификаторы, соответствующие данной команде, не выдают сообщений; подробнее об этом см. главу 4).

Методы validDoList(actor, prep, indirectObject) и validIoList(actor, prep, directObject) возвращают список список всех объектов, для которых имеет смысл выполнять, соответственно, validDo или validIo. В принципе без этих методов можно обойтись; их единственная цель - произвести грубую предварительную проверку объектов, чтобы сократить число вызовов validDo и validIo и таким образом повысить производительность (скорость работы) игры - каждое выполнение validDo или validIo требует довольно значительных затрат времени.

Атрибут type определяет тип глагола для определения окончания глагола (см. функцию glok). Свойство vopr указывает, какое местоимение будет выводить игра, если игрок пропустит объект в своей команде (например, если игрок даст команду "лечь"). Свойство vopr определяет, какой вопрос будет задавать игра, если игрок пропустил в своей команде объект. Например, если будет дана команда "отпереть", игра задаст вопрос "Что вы хотите отпереть?" (для этого глагола vopr = "Что "), а если ввести "сойти", игра спросит "Откуда вы хотите сойти?" (vopr = "Откуда ").


dialItem

dialItem: fixeditem. Данный класс используется для создания "циферблатов", т. е. переключателей, которые можно установить на определенное значение (например, таких, как регулятор интенсивности нагрева конфорок бытовой плиты). При реализации объекта этого класса автору необходимо указать значения свойств minsetting и maxsetting, определяющих, соответственно, минимальное и максимальное число, на которое можно установить данный объект (например, для вышеупомянутого регулятора плиты эти значения могут составлять: minsetting = 0 (конфорка выключена), maxsetting = 3 (максимальная степень нагрева - считаем, что регулятор у нас трехступенчатый). По умолчанию эти значения составляют 1 и 10. Свойство setting определяет текущую установку переключателя - она может изменяться игроком посредством команд вида "повернуть переключатель на 3". Метод ldesc для данного класса по умолчанию выводит текущую установку объекта.


distantItem

distantItem: fixeditem. Определяет предметы, которые находятся слишком далеко, чтобы ими можно было манипулировать, но при этом видны. Реакцией на любые команды, кроме "осмотреть", будет "Предмет слишком далеко." Для объектов-наследников данного класса должны быть определены все обычные свойства предметов: sdesc, ldesc, location, а также лексические свойства.


doorway

doorway: fixeditem, obstacle. Объект-дверь, который представляет собой препятствие (obstacle), которое препятствует перемещению в заданном направлении до тех пор, пока его не откроют (этому состоянию двери соответствует значение true, возвращаемое свойством isopen). Если дверь открыта, то игрок (или другой персонаж) при движении в соответствующем направлении попадает в комнату, определяемую свойством doordest. Поскольку дверь является препятствием, то для правильной ее реализации следует присвоить свойству-направлению значение, равное объекту-двери. Если атрибут noAutoOpen не равен true, дверь будет автоматически открываться при попытке игрока перемещаться в соответствующем направлении, если только эта дверь не заперта (свойство islocked не возвращает true). Если дверь заперта, ее можно открыть вводом команды "отпереть дверь", если свойство mykey не установлено равным какому-либо объекту, который в этом случае выполняет роль ключа (при этом дверь можно отпереть, только введя команду "отпереть дверь ключом", при этом для объекта-ключа должны быть определены соответствующие методы (verIoUnlockWith, ioUnlockWith), и, кроме того, он должен иметься в распоряжении игрока. Обратите внимание, что дверь может быть вновь заперта игроком только при соблюдении условий, при которых обеспечивается отпирание двери, а также при выполнении дополнительного условия: свойство islockable должно быть равным true. По умолчанию объект-дверь закрыт; если необходимо, чтобы в начале игры дверь была открыта, установите свойство isopen равным true (при этом необходимо, чтобы и другая сторона двери была открыта - см. далее).

Свойство otherside определяет другую сторону двери (если она есть), расположенную в комнате, куда ведет данная дверь (определяемой свойством doordest). Необходимость данного свойства обуславливается тем, что в реальности дверь существует как бы в двух комнатах сразу. Свойство otherside для двери должно ссылаться на объект того же класса doorway (исключение составляют случаи, когда необходимо добиться некоторых спецэффектов, однако при этом автор игры должен весьма четко представлять, чего именно он хочет добиться - рекомендации здесь давать практически невозможно); при взаимной ссылке свойств otherside двух объектов-дверей друг на друга их состояния (двери закрыты-открыты и заперты-отперты - определяются свойствами isopen и islocked соответственно) будут автоматически синхронизироваться.

Прочие свойства: isdoor - атрибут-флаг, маркирующий данный объект как объект-дверь (равен true); setIsopen и setIslocked - служебные методы, которые "отвечают" соответственно за открытие-закрытие и отпирание-запирание двери и, в частности, обеспечивают синхронизацию состояния двери с другой ее стороной, определяемой свойством otherside.


fixeditem

fixeditem: thing. Объект, который невозможно взять или сдвинуть с места каким-либо другим образом. Обратите внимание, что объекты этого класса могут оказаться частью перемещаемого объекта; это делается, например, для того, чтобы не допустить разделения объектов, когда один объект является неотъемлемой частью другого (например, чайник и носик чайника). По умолчанию, функции, отвечающие за отображение списка объектов в помещении, не включают в этот список объекты класса fixeditem (поскольку их свойство isListed установлено равным nil); это сделано потому, что такие объекты обычно включаются автором игры в подробное описание (свойство ldesc) комнаты. В качестве дополнительной индикации того, что объект является неподвижным, для данного класса определено свойство isfixed, равное true.


floatingItem

floatingItem: object. Этот класс служит исключительно для того, чтобы пометить объект-наследник как присутствующий во всех помещениях игры (это полезно, например, при реализации пола или стен - вместо того, чтобы создавать соответствующие объекты для каждой комнаты, достаточно определить их один раз как наследников данного класса). Необходимость определять такие объекты как принадлежащие данному классу связана с тем, что при инициализации игры объекты этого класса заносятся в список global.floatingList, который анализируется на этапе валидации команды игрока методами validDoList и validIoList (описание этих методов см. в классе deepverb).


follower

follower: Actor. Объект-"тень", повторяющий перемещения персонажа из помещения в помещение. Назначение этого класса - позволить игроку следовать за персонажем, который покинул комнату, введя команду "следовать за". Для каждого персонажа, за которым игрок может следовать, должен быть определен отдельный объект класса follower. Объект-"тень" должен иметь идентичные с соответствующим ему персонажем лексические свойства (noun и adjective). Для этого объекта также необходимо определить свойство myactor так, чтобы оно ссылалось на персонажа, за которым будет следовать игрок при помощи данного объекта-"тени". Атрибут isfollower, равный true, дополнительно помечает объект как объект-"тень". "Тень" всегда отстает от персонажа на одну комнату; к ней неприменимы никакие команды, кроме "следовать за".


fooditem

fooditem: item. Объект, который можно съесть. При съедании объект удаляется из игры, а значение свойства global.lastMealTime (время последнего приема пищи) уменьшается на величину свойства foodvalue объекта. По умолчанию значение foodvalue равно global.eatTime (этот параметр определяет максимальное количество ходов, которое игрок (точнее, главный персонаж в игре) может обходиться без еды). Таким образом, стандартного съедобного предмета хватит, чтобы поддержать силы игрока в течение стандартного интервала времени. См. также eatDaemon.


hiddenItem

hiddenItem: object. Принадлежность предмета к данному классу указывает на то, что он спрятан при помощи объекта, принадлежащего одному из классов hider. Класс hiddenItem не определяет никаких собственных свойств, а используется исключительно для того, чтобы функция инициализации initSearch могла определить и зарегистрировать такие объекты.


hider

hider: item. Это базовый класс для реализации предметов, служащих для скрытия других предметов различными способами. Напрямую он не используется, вместо него используются его дочерние классы - underHider, behindHider и searchHider. Класс определяет метод searchObj(actor, list), которому передается через аргумент list список предметов, скрытых посредством данного объекта (для объекта класса underHider, к примеру, для этого используется свойство underCont); этот метод позволяет игроку "найти" скрытые предметы при подаче соответствующей команды. Некоторые особенности работы этого метода определяются парой дополнительных свойств, определенных для класса hider. Свойство serialSearch определяет, будут ли найдены сразу все скрытые предметы (в случае, если данный объект используется для скрытия более одного предмета); если оно имеет значение nil (значение по умолчанию), то игрок найдет сразу все предметы, если же оно равно true, игроку придется подать команду поиска несколько раз - по числу скрытых предметов, чтобы найти их все. Свойство autoTake определяет, перемещаются ли найденные предметы в инвентарь игрока автоматически: если оно равно true, то игрок автоматически берет найденные предметы, если же nil, то потребуется в явном виде дать команду, чтобы взять предмет. Метод searchObj удаляет из переданного ему списка list найденные предметы. Вызвавшая этот метод процедура (или метод) должна записать его значение в соответствующую переменную (например, для объекта класса underHider это будет свойство underCont), иначе игрок будет получать сообщение о найденном предмете всякий раз, когда будет обыскивать скрывающий объект.

Обратите внимание, что, поскольку объекты класса hider используются для скрытия других объектов, то в нем переопределен метод verDoSearch, "отвечающий" за верификацию команды "обыскать": здесь он выдает сообщение типа "Тебе нужно более детально описать как ты хочешь обыскать данный предмет". Это сделано потому, что сообщение стандартного метода verDoSearch ("Ты не нашел ничего интересного") вводит игрока в заблуждение, создавая у него впечатление, что предмет уже достаточно тщательно обыскан. С другой стороны, для большинства объектов класса hider ситуация, когда общая команда "обыскать" сразу дает нужный результат, также нежелательна (например, требуется "заглянуть под" некий предмет). Поэтому мы просто выдаем сообщение, что простого обыскивания оказалось недостаточно, но не говорим игроку, что конкретно ему надо сделать.

Объекты, скрываемые посредством объекта класса hider, должны принадлежать классу hiddenItem.


item

item: thing. Обычный предмет, который игрок может взять и носить с собой. Он ничего не весит (свойство weight имеет значение 0) и занимает минимальный объем (свойство bulk равно 1). Свойству bulk можно присвоить большее, чем единица, значение для громоздких предметов, а для мелких предметов, которые не сказываются на способности игрока нести другие предметы (не занимают руки игрока), типа листа бумаги, это свойтво можно установить равным нулю.


keyedLockable

keyedLockable: lockable. Данный класс-наследник класса lockable позволяет создать объект-контейнер, который можно отпереть или запереть только при помощи ключа. Ключом будет объект, на который будет ссылаться свойство mykey (при этом сам объект-ключ должен быть наследником класса keyItem).


keyItem

keyItem: item. Объект, который можно использовать в качестве ключа для объектов класса keyedLockable и lockableDoorway (т. е. отпирать и запирать их). Во всем остальном его поведение соответствует классу item.


lightsource

lightsource: item. Переносной фонарь, свеча, спичка или другой источник света. Включать и выключать источник света можно при помощи свойства islit. Если это свойство возвращает true, то источник включен (освещает помещение), если же нет, то этот источник совершенно идентичен обычному объекту. Обратите внимание, что стандартное определение класса lightsource определяет метод doTurnon для обработки глагола "включить", обеспечивающий загорание объекта, однако НЕ определяет верификационного метода для этого глагола verDoTurnon. Вследствие этого, если вы определите в вашей игре источник света просто как наследник класса lightsource, его нельзя будет включать и выключать. Чтобы корректно реализовать включение и выключение источника света, сделайте его наследником сразу двух классов - lightsource и switchItem (при этом перечислите классы в определении объекта именно в том порядке, какой здесь указан - в противном случае метод doTurnon класса switchItem "затрет" соответствующий метод класса lightsource). Свойство islamp используется при инициализации игры, в процессе которой, в частности, функцией initSearch регистрируются и заносятся в специальный список все объекты, которые могут служить источниками света (признаком для занесения в список является то, что их свойство islamp равно true). Этот список затем используется в игре для определения, освещена ли та или иная комната (грубо говоря, если в ней присутствует объект из этого списка и он включен, то она освещена, в противном случае выводится описание для темной комнаты). Из сказанного очевидно, что модифицировать это свойство не следует.


lockable

lockable: openable. Объект-контейнер, который можно отпирать и запирать; запертое состояние определяется атрибутом islocked (если он равен true, контейнер заперт, и его вначале надо отпереть, чтобы открыть). При этом для отпирания и запирания контейнеров данного класса не требуется ключ; если вы хотите сделать так, чтобы контейнер отпирался и запирался ключом, используйте класс keyedLockable.


lockableDoorway

lockableDoorway: doorway. Запираемая дверь. Данный класс ничем не отличается от обычной двери (см. doorway), за исключением того, что его атрибуты islockable и islocked установлены равными true. Остальные свойства (в первую очередь otherside и doordest) определяются, как обычно. Если дверь отпирается/запирается при помощи ключа, то свойство mykey следует определить так, чтобы оно ссылалось на объект, который соответствует этому ключу.


movableActor

movableActor: qcontainer. Этот класс подобен классу Actor, но, в отличие от последнего, игрок может взять персонажа класса movableActor в руки и носить с собой. Данный класс удобно использовать при реализации, например, мелких животных.

Многие атрибуты и методы, определенные в movableActor, описаны при рассмотрении класса Actor. Ниже рассмотрены прочие свойства класса movableActor.

askWord(word, lst) - функция, используемая при реализации команды "спросить персонажа о чем-либо". Здесь word - это то самое "что-либо", о котором спрашивают, а lst - полный список слов в команде (скорее всего, вам не потребуется его анализировать). В настоящее время команды такого вида реализуются не так, как это описано в главе седьмой настоящего Руководства (при выборе ответа анализируется не объект, о котором спрашивается, а слово, которое этому объекту соответствует). Если у вас в игре имеется, скажем, штук 8 объектов, к каждому из которых будет применимо слово "колесо", вы наверняка оцените преимущество такого способа реализации диалога. Если метод askWord возвращает true, дальнейшая обработка слова прекращается, поскольку считается, что персонаж уже ответил. В противном случае вызывается метод disavow. По умолчанию askWord просто возвращает nil, и для реализации осмысленного диалога с персонажем вам обязательно потребуется ее переопределить.

disavow - метод, выводящий ответ персонажа на команду вида "спросить клоуна о цирке" в случае, если персонаж не смог дать осмысленного ответа на поставленный вопрос (см. метод askWord). По умолчанию выводится ответ "Об этом я ничего не знаю."

fmtMe, fmtYou, fmtYour, fmtYoum, fmtYouve - определяют "форматные" строки, позволяющие отображать универсальную реакцию предметов на применяемые к ним команды (этот вопрос рассматривается в другом разделе Руководства по TADS; если коротко, то за счет использования "форматных" строк можно добиться, чтобы при попытке манипулировать предметом (например, командой "взять мяч") выдавалось бы сообщение типа "Ты не можешь взять мяч", если действие пытается выполнить сам игрок, либо, например, "Он не может взять мяч", если игрок дал команду на выполнение действия какому-либо другому персонажу (скажем, "мальчик, возьми мяч").

isactor - специальный флаг, который для персонажей установлен равным true. Служит в качестве дополнительной проверки, является ли тот или иной объект персонажем или просто предметом.

preferredActor - служит для маркировки предпочтительного персонажа при двусмысленной команде (т. е. команде, которая может относиться сразу к двум или более персонажам); персонажам, для которых этот атрибут равен true, будет оказываться предпочтение перед теми, для которых он равен nil.

sayLeaving, sayArriving - методы, выводящие сообщение о том, что персонаж, соответственно, вышел из помещения или вошел в него.

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

travelTo(room) - перемещает персонажа в комнату room, в случае необходимости уведомляя игрока, что персонаж вышел из той комнаты, где находится игрок, или, наоборот, вошел в нее.

Блок свойств-указателей на свойства-направления комнаты (см. также объект room): northProp, southProp, eastProp, westProp, neProp, nwProp, seProp, swProp, inProp, outProp, upProp, downProp. Эти свойства определяют, какое свойство-направление комнаты, в которой находится персонаж, будет вызываться при попытке персонажа двигаться в том или ином направлении (перечисленные свойства соответствуют (в порядке перечисления) северу, югу, востоку, западу, северо-востоку, северо-западу, юго-востоку, юго-западу, входу, выходу, верху и низу). Этот механизм позволяет определять разные выходы из помещения для игрока и других персонажей (например, закрывать для игрока некоторые из направлений, доступных персонажам).


nestedroom

nestedroom: room. "Вложенная" комната - особый тип комнаты, которая расположена внутри другой комнаты; в эту категорию попадают, например, стулья, а также некоторые виды транспортных средств (надувные лодки, велосипеды...). Обратите внимание, что одну комнату можно поместить в другую, даже если она не относится к классу nestedroom; для этого достаточно просто приравнять "внешней" комнате ее свойство location. Коренное отличие nestedroom от обычной локации состоит в том, что эта комната "открыта"; когда игрок находится внутри нее, то игра при выводе описаний указывает, что он находится во "внешней" (или основной) локации (например, выводится описание типа "Лаборатория, на стуле"). Кроме того, объекту nestedroom соответствует предмет в мире игры, который игрок видит и с которым он может взаимодействовать; например, стул, помимо того, что является локацией, также представляет собой предмет в основной комнате. Свойство statusPrep указывает предлог, который используется в описании, когда игрок находится внутри "вложенной" комнаты ("Гостиная, на диване") По умолчанию используется предлог "в", но некоторые дочерние классы (и объекты) его переопределяют. Свойство outOfPrep определяет предлог, который используется при выводе соощбения, когда игрок покидает "вложенную" комнату; это могут быть предлоги "из" или "с(о)" - в зависимости от объекта. См. также beditem, chairitem, vehicle.


numberedObject

numberedObject: object. Этот класс можно использовать для того, чтобы принадлежащий этому классу объект мог использоваться в качестве нумерованного предмета, к которому игрок может в процессе игры обращаться по его номеру. Например, можно создать объект-"кнопку", к которому игрок сможет обращаться при помощи совосочетаний, например, "кнопка 100", "кнопка 1000". Если вы хотите ограничить интервал допустимых номеров, измените метод num_is_valid таким образом, чтобы он отображал соответствующее сообщение об ошибке и возвращал nil при вводе неправильного номера. Если вам необходим отдельный объект для обработки обращений к кнопкам во множественном числе ("посмотреть на кнопки"), измените метод newNumberedPlural так, чтобы он возвращал тот объект, который должен обрабатывать такие обращения; по умолчанию они обрабатываются тем же нумерованным объектом.


obstacle

obstacle: object. Объект-препятствие, который указывается в свойствах-направлениях комнаты (класс room) вместо ссылки на другую комнату. При этом свойство destination должно возвращать ссылку на комнату, куда должен попасть игрок (или другой персонаж), когда успешно преодолеет препятствие (например, отопрет дверь). Если преодолеть препятствие не удастся, свойство destination должно выводить соответствующее сообщение и возвращать nil. Атрибут isobstacle - флаг, помечающий объект-препятствие как принадлежащий классу obstacle (по умолчанию определен равным true для данного класса).


openable

openable: container. Объект-контейнер, который можно открывать и закрывать. Атрибут isopenable, определяющий принадлежность объекта данному классу, установлен равным true. Свойство ldesc по умолчанию выводит список предметов, содержащихся в контейнере, если он открыт, или сообщение о том, что контейнер закрыт, в противном случае. Атрибут isopen, определяющий, открыт контейнер или нет, по умолчанию установлен равным true (т. е. контейнер открыт); его значение изменяется соответствующим образом при обработке команд вида "открыть контейнер" и "закрыть контейнер". Если в начале игры требуется, чтобы контейнер был закрыт, следует при описании объекта присвоить данному атрибуту свойство nil.


Prep

Prep: object. Объект-предлог. Лексическое свойство.


qcontainer

qcontainer: container. "Молчаливый" контейнер, т. е. контейнер, для которого не выводится список предметов, находящихся в нем, пока игрок специально не осмотрит его. Данный класс отличается от своего родительского класса только тем, что для него определен равным true атрибут-флаг isqcontainer, который анализируется методами класса container при принятии решения, выводить ли список предметов, находящихся в данном контейнере, или нет.


qsurface

qsurface: surface. "Молчаливая" поверхность, т. е. поверхность, для которой не выводится список предметов, лежащих на ней, пока игрок специально ее не осмотрит. Данный класс отличается от своего родительского класса только тем, что для него определен равным true атрибут-флаг isqsurface, который анализируется методами класса surface при принятии решения, выводить ли список предметов, лежащих на данной поверхности, или нет.


readable

readable: item. Предмет, который можно читать. При чтении объекта этого класса (например, команда "прочитать книгу") будет выполнено свойство readdesc. По умолчанию readdesc совпадает с ldesc, но автор игры может переопределить свойство так, чтобы, например, отображался другой текст.


room

room: thing. Комната (локация) в игре. По умолчанию свойство islit равно true, что означает, что комната освещена (для того, чтобы осмотреться в ней, не требуется дополнительный источник света). Чтобы создать неосвещенную комнату, лучше воспользоваться классом darkroom, а не присваивать свойству islit объекта класса room значение nil, поскольку потребуется изменить и ряд других методов/свойств. Свойство isseen определяет, был ли уже игрок в этой комнате раньше или попал в нее первый раз; изначально оно имеет значение nil и устанавливается равным true при первом посещении комнаты игроком. Метод roomAction(actor, verb, directObject, preposition, indirectObject) (передаваемые параметры - актер, глагол, "прямой" объект, предлог, "косвенный" объект) выполняется всякий раз, когда игрок пытается выполнить какое-либо действие, находясь в комнате; по умолчанию этот метод вызывает аналогичный метод объекта, в котором находится данная комната (при условии, что эта комната где-то находится, т. е. ее свойство location не равно nil). Если в процессе выполнения этого метода будет выполнена инструкция exit, то дальнейшая обработка команды игрока будет прервана. Этим можно воспользоваться, например, для ограничения некоторых действий игрока, специфичных именно для конкретной комнаты; скажем, можно создать комнату с гнилым полом, по которому игрок сможет ходить, однако если он попытается прыгнуть, пол провалится, и игрок окажется в подвале. Такое поведение комнаты удобнее всего реализовывать именно с помощью метода roomAction. Обратите внимание, что если данный метод выполнит какие-либо действия (например, выдаст сообщение), однако инструкции exit в нем не окажется, то после завершения работы метода команда игрока будет обрабатываться дальше, как ни в чем не бывало (для вышерассмотренного примера с комнатой с гнилым полом это будет означать, что после того, как игрок окажется в подвале, будет отображено стандартное сообщение, выдаваемое при команде "прыгнуть", что в данном случае, конечно, нежелательно). Метод lookAround(verbosity) выводит на экран описание комнаты - краткое или подробное, в зависимости от указанного режима (определяется параметром verbosity: если он равен true, будет выведено подробное описание, а если nil - то только краткое, т. е. название комнаты и список находящихся в ней "движимых" объектов). Метод roomDrop(object) вызывается, когда игрок бросает (в смысле выпускает из рук) объект object, находясь внутри комнаты. По умолчанию этот метод просто перемещает соответствующий предмет в комнату и выдает сообщение вида "Брошено." Метод firstseen вызывается, когда игрок впервые попадает в данную локацию (когда свойству isseen присваивается значение true); по умолчанию этот метод ничего не делает, однако он представляет собой удобное место для определения действий, выполняемых только при первом посещении комнаты игроком. Обратите внимание, что вызов firstseen осуществляется после отображения описания комнаты. Свойства для направлений (north, south, east, west, up, down, ne, nw, se, sw, in, out - соответствуют северу, югу, востоку, западу, верху, низу, северо-востоку, северо-западу, юго-востоку, юго-западу, входу и выходу) определяют помещение, куда попадает игрок или персонаж, пытаясь идти в данной локации в определенном направлении. Если то или иное из этих свойств возвращает другую комнату, то игрок именно в нее и попадет. Если же свойство возвращает nil, игрок остается в текущей комнате. По умолчанию все свойства-направления выводят сообщение (при помощи метода noexit) "Этим путем не пройти" и возвращают nil. Чтобы разрешить игроку двигаться в том или ином направлении, достаточно присвоить соответствующему свойству значение, равное объекту, соответствующему локации, куда игрок должен попасть.

Другие свойства, определенные для данного класса:

actorNorth, actorSouth, actorEast, actorWest, actorUp, actorDown, actorNE, actorNW, actorSE, actorSW, actorIn, actorOut - свойства-направления для персонажа в игре (не игрока); соответствуют северу, югу,востоку, западу, верху, низу, северо-востоку, северо-западу, юго-востоку, юго-западу, входу и выходу. По умолчанию перемещение из комнаты персонажа происходит так же, как и для игрока, но автор игры может изменять порядок перемещения для персонажей (например, разрешить им перемещаться в направлениях, закрытых для игрока), используя данные свойства. Работа с этими свойствами аналогична работе с описанными выше свойствами-направлениями для игрока.

addLeaveList(obj) - см. leaveRoom(actor)

cantReachRoom(otherRoom) - этот метод вызывается из свойства cantReach в случае, когда игрок находится не непосредственно в комнате, а внутри некоторого объекта, расположенного в этой комнате. См. также свойство cantReach объекта thing.

dispBeginLdesc, dispEndLdesc - служебные методы низкого уровня, вызываемые методом lookAround соответственно до и после отображения подробного описания комнаты (ldesc). По умолчанию dispBeginLdesc осуществляет переход на новый абзац, а dispBeginLdesc не делает ничего; эти методы имеет смысл модифицировать при необходимости, например, специального оформления подробного описания комнаты.

dispBeginSdesc, dispEndSdesc - служебные методы низкого уровня, вызываемые методом lookAround соответственно до и после отображения краткого описания комнаты (sdesc). По умолчанию не делают ничего, однако при необходимости, например, специального оформления краткого описания комнаты их можно модифицировать.

dispEndLdesc - см. dispBeginLdesc.

dispEndSdesc - см. dispBeginSdesc.

dispParagraph - служебный низкоуровневый метод, выводящий начало нового абзаца (по умолчанию осуществляет перевод строки и отступ на 4 пробела). Данный метод используется методом lookAround при выводе описания комнаты; его следует модифицировать, если требуется иное оформление абзаца.

enterRoom(actor) - вызывается всякий раз, когда персонаж actor заходит в данную комнату. С его помощью удобно реализовывать эффекты, которые должны повторяться всякий раз при входе в комнату (например, активация "демона" персонажа, постоянно находящегося в данной комнате). По умолчанию этот метод обеспечивает вывод на экран описания комнаты при входе в нее. Модифицируя этот метод для конкретного объекта, не забудьте вызвать метод enterRoom родительского класса при помощи инструкции pass.

meIsMovingInto(meActor) - вызывается в случае, если игрок (главный персонаж) явным образом перемещается в данную комнату при помощи своего метода moveInto (а не travelTo). По умолчанию meIsMovingInto ничего не делает. Обратите внимание, что этот метод выполнется до того, как игрок попадет в комнату назначения, поэтому в процессе исполнения meIsMovingInto доступны все свойства и методы для комнаты, откуда перемещается игрок (при этом следует отметить, что свойства и методы комнаты, куда он перемещается, также доступны через объект self).

leaveList - см. leaveRoom(actor)

leaveRoom(actor) - метод вызывается всякий раз, когда персонаж actor покидает данную локацию. С помощью этого метода удобно реализовывать эффекты, которые должны повторяться всякий раз при выходе из комнаты (например, отключение "демона" персонажа, постоянно находящегося в данной комнате). По умолчанию метод выполняет следующие действия: просматривает список объектов, содержащийся в свойстве leaveList (чтобы занести объект в этот список, необходимо "зарегистрировать" объект, вызвав метод addLeaveList). Для каждого объекта из этого списка выполняется свойство leaving и, если оно возвращает true, объект исключается из списка leaveList. Такой механизм может быть удобен для реализации некоторых спецэффектов (например, вывод сообщения, когда игрок пытается вынести определенный объект из комнаты). Свойства leaveList и addLeaveList лучше не модифицировать. При изменении же leaveRoom не забудьте вызвать соответствующий метод родительского класса при помощи инструкции pass

meIsMovingInto(meActor) - вызывается в случае, если игрок (главный персонаж) явным образом перемещается в данную комнату при помощи своего метода moveInto (а не travelTo). По умолчанию meIsMovingInto ничего не делает. Обратите внимание, что этот метод выполнется до того, как игрок попадет в комнату назначения, поэтому в процессе исполнения meIsMovingInto доступны все свойства и методы для комнаты, откуда перемещается игрок (при этом следует отметить, что свойства и методы комнаты, куда он перемещается, также доступны через объект self).

nrmLkAround(verbosity) - служебный "подметод" для lookAround(verbosity); в нем выполняются практически все необходимые действия для вывода описания комнаты, за исключением отображения строки статуса.

roomCheck(v) - этот метод возвращает true, если глагол v в принципе "работает" в данной комнате. Если метод возвращает nil, то дальнейшая обработка команды игрока прерывается. Этот метод используется в качестве грубой предварительной проверки допустимости команды для данного помещения; основное его предназначение - "отсечь" недопустимые команды для темных помещений (см. также объект darkroom). По умолчанию в комнате разрешены все команды (метод всегда возвращает true).

statusLine - используется методом lookAround(verbosity) для отображения строки статуса. Напрямую изменять этот метод не рекомендуется; если требуется отличный от принятого по умолчанию формат строки статуса (краткое описание текущей локации и указание (через дробь) числа сделанных ходов и набранных очков), следует модифицировать метод statusRoot класса room, а также функцию scoreFormat.

statusRoot - используется методом statusLine для отображения левой части строки статуса; по умолчанию выводит краткое описание текущей локации.


searchHider

searchHider: hider. Этот класс аналогичен классу underHider, только предметы скрываются не под "объектом-укрытием", а внутри него, и чтобы их найти, игроку необходимо обыскать "объект-укрытие" или заглянуть в него. Для спрятанных внутри объекта данного класса предметов свойство searchLoc должно ссылаться на "объект-укрытие". См. также behindHider. Обратите внимание, что поведение объектов данного класса отличается от обычных контейнеров, поскольку, в отличие от последних, спрятанного предмета изначально в игре нет - он появляется в ней только после того, как игрок даст соответствующую команду, чтобы обыскать "объект-укрытие".

Объекты, скрываемые посредством объекта класса searchHider, должны принадлежать классу hiddenItem.


seethruItem

seethruItem: item. Предмет, сквозь который игрок может посмотреть (например, окно). При этом отображение соответствующей реакции на команду "посмотреть сквозь..." обеспечивается методом thrudesc. Обратите внимание, что данный класс отличается от класса transparentItem, служащего для определения объекта-контейнера, у которого видно его содержимое.


surface

surface: item. Поверхность, на которую можно класть другие объекты. За исключением атрибута-флага issurface, равного true и помечающего объект-наследник как принадлежащий данному классу, а также использования предлога "на" вместо предлога "в" при перечислении предметов, находящихся на объекте-наследнике данного класса (например, фразы вроде "На пьедестале лежит золотой череп"), класс surface практически не отличается от класса container. Обратите внимание, что объект не может одновременно принадлежать и классу surface, и классу container, поскольку между ними нет внутренних различий (иначе говоря, синтаксический анализатор не увидит разницы между предметом, который положили на данную поверхность-контейнер и в нее, и при описании поверхности-контейнера всегда будет выводить или "На пьедестале лежит золотой череп", или "В пьедестале лежит золотой череп" - в зависимости от того, какой из классов, surface или container, указан в заголовке определения объекта-пьедестала первым, не обращая внимания на то, как именно золотой череп оказался в/на пьедестале - по команде "положить в" или "положить на").


switchItem

switchItem: fixeditem. Данный класс определяет объекты, которые игрок может включать и выключать. Единственным специфичным для данного класса свойством является isActive, которое равно nil, когда выключатель выключен, или true, когда он включен. Объект воспринимает команды вида "включить его" и "выключить это" и тому подобные инструкции, при этом соответствующим образом изменяется значение свойства isActive.


sysverb

sysverb: deepverb, darkVerb. Системные объекты-глаголы, используемые для реализации служебных команд, например, таких, как "сохранить", "восстановить", "завершить" и др. В первую очередь данный класс служит для того, чтобы при выполнении команд, соответствующих принадлежащим ему объектам-глаголам, обходились проверки, предпринимаемые в обычных случаях (например, эти глаголы можно выполнять и в темной комнате). Атрибут-флаг issysverb для глаголов этого класса всегда равен true.


theFloor

theFloor: beditem, floatingItem. Специальный объект (соответствующий полу), присутствующий во всех помещениях (достигается за счет специального определения свойства location). Он добавлен в основном в целях полноты реализации, чтобы игрок мог обращаться к полу в процессе игры. За исключением этого, объект не выполняет каких-либо специальных действий; например, если игрок бросит некий предмет на пол, этот предмет просто будет перемещен в текущую комнату.


thing

thing: object. Базовый класс для всех предметов в игре. Свойство contents представляет собой список, определяющий, что находится в объекте. Это свойство автоматически устанавливается системой после компиляции игры таким образом, чтобы в свойстве содержался список всех предметов, свойство location которых указывает на данный объект. Синхронизация обоих свойств производится посредством метода moveInto, поэтому при перемещении объектов настоятельно рекомендуется использовать этот метод вместо прямого изменения свойства location. Методы adesc и thedesc отображают название предмета с неопределенным и определенным артиклем; для русскоязычных игр они неактуальны. Метод sdesc (сокращенное от short description - краткое описание) предназначен для вывода названия объекта в именительном падеже. В русской версии TADS дополнительно определены свойства rdesc, ddesc, vdesc, tdesc и pdesc для отображения краткого описания предмета соответственно в родительном, дательном, винительном, творительном и предложном падежах. Свойство isThem указывает число объекта (единственное или множественное), а свойства isHim и isHer - мужской и женский род соответственно (если ни одно из этих свойств не определено, предмет считается имеющим средний род). Метод ldesc - это подробное или "длинное" описание объекта, которое обычно отображается, когда игрок смотрит на предмет. По умолчанию выводится нечто типа "Это кажется обычным предметом". Метод isIn(object) возвращает true, если местоположением предмета является переданный в качестве аргумента объект object, или если свойство location объекта указывает на объект, чей метод contentsVisible возвращает true и метод isIn этого объекта также возвращает true для аргумента object. Обратите внимание, что, если метод isIn возвращает true, это необязательно означает, что объектом можно манипулировать, поскольку этот метод возвращает true и в том случае, если объект просто виден. Метод thrudesc по умолчанию выводит сообщение, когда игрок пытается посмотреть сквозь предмет; он может оказаться полезным, например, при реализации окон. Метод moveInto(object) перемещает предмет в указанный в качестве аргумента объект object, как было описано выше. Чтобы удалить какой-либо предмет из игры, можно осуществить вызов этого метода с nil в качестве аргумента.

Прочие свойства и методы, определяемые для класса thing:

actorAction(v, d, p, i) - метод используется, когда игрок дает команду данному предмету (например, "робот, открой дверь"); аргументами метода являются глагол, использующийся в команде, "прямой" объект, предлог и "косвенный" объект; если каких-либо сотставляющих в команде нет, соответствующий аргумент будет заменен на nil. Например, для вышеупомянутой команды "робот, открой дверь" метод actorAction объекта, соответствующего роботу, будет вызван со следующими аргументами: v будет равно объекту, соответствующему глаголу "открыть", d будет ссылаться на объект, соответствующий двери, а p и i будут равны nil. Если будет отдана команда "робот, открой дверь посредством ключа", то аргументом p будет объект, соответствующий предлогу "посредством", а i - объект, соответствующий ключу (остальные аргументы не изменятся). Если внутри метода выполняется инструкция exit, то на этом обработка команды завершается, в противном случае она обрабатывается нормальным образом. В объекте thing метод возвращает сообщение о невозможности отдать предмету команду и завершает работу инструкцией exit.

bulk - в буквальном переводе "громоздкость", т. е. объем, занимаемый предметом. См. функцию addbulk).

cantReach(actor) - этот метод вызывается, если персонаж пытается манипулировать предметом, который виден персонажу, но недоступен для него. Если предмет находится внутри другого объекта-контейнера, не ограничивающего доступ к своему содержимому (типа открытой коробки), мы передаем управление соответствующему методу этого контейнера. Если предмет находится внутри закрытого контейнера, выдается сообщение о том, что контейнер надо открыть. Как правило, это означает, что контейнер прозрачный, т. е. его содержимое видно, но недоступно. Метод является служебным и в общем случае не должен модифицироваться.

cantReachRoom(actor) - этот метод вызывается, если персонаж, находясь (непосредственно) внутри данного предмета, пытается манипулировать другим предметом в заданной комнате, который ему недоступен. При этом должно выдаваться сообщение, объясняющее игроку, почему предмет в заданной комнате виден, но недоступен. По умолчанию игроку просто сообщается, что объект недоступен; для некоторых локаций может потребоваться более развернутое сообщение.

circularMessage(io) - выводит соответствующее сообщение, если игрок пытается положить в контейнер предмет, который уже в этом контейнере находится (включая случаи вложенных друг в друга контейнеров). Метод является служебным и в общем случае не должен модифицироваться.

contents - список содержимого предмета, т. е. всех предметов, свойство location которых ссылается на данный объект. Свойство устанавливается системой автоматически, модифицировать его непосредственно не рекомендуется.

contentsReachable - указывает, доступно ли игроку содержимое данного предмета, т. е. может ли он манипулировать предметами, находящимися внутри данного предмета (если метод возвращает true, то содержимое доступно, а если nil, то нет). По умолчанию возвращает true.

contentsVisible - указывает, видно ли игроку содержимое данного предмета (если возвращает true, то видно, а если nil, то нет). По умолчанию возвращает true.

foritdesc - в зависимости от числа и рода предмета выводит "им", "ей" или "ему".

isListed: если это свойство равно true, то объект явным образом отображается в описании комнаты, где он находится (после основого текста описания комнаты выводится фраза типа "Ты видишь здесь..." и название предмета). Если это свойство равно nil, предмет в описании комнаты не отображается.

isReachable(actor) - возвращает true, если предмет доступен для персонажа actor, или nil, если недоступен. При определении доступности предмета используются следующие правила: предмет доступен, если он принадлежит списку reachable помещения, либо если он находится внутри контейнера (или ряда контейнеров), содержимое которого (или всей цепочки контейнеров) доступно, и сам контейнер также доступен. Метод является служебным и в общем случае не должен модифицироваться.

isVisible(vantage) - возвращает true, если предмет видим из объекта (точки наблюдения) vantage, или nil в противном случае. При определении видимости предмета используются следующие правила: предмет виден, если точка наблюдения находится внутри него, и содержимое предмета видно; если предмет находится внутри точки наблюдения; если видны объект-местоположение предмета и содержимое этого объекта; если у точки наблюдения имеется местоположение, отличное от nil, при этом содержимое местоположения этой точки видно (принцип "если ты видишь меня, то я вижу тебя"), и сам предмет виден из местоположения точки наблюдения; во всех остальных случаях предмет невидим. Метод является служебным и в общем случае не должен модифицироваться.

itnomdesc - выводит местоимение для данного объекта в зависимости от его числа (значения свойства isThem - "они" для множественного числа и "это" для единственного.

itobjdesc - в зависимости от числа и рода предмета выводит "их", "её" или "его".

itselfdesc - в зависимости от числа и рода предмета выводит "них самих же", "него же" или "неё саму же".

lico - специфическое для русской версии TADS свойство, возвращает лицо (число 1, 2 или 3), соответствующее данному предмету. Данное свойство необходимо для правильного отображения окончаний глаголов во фразах, содержащих ссылки на данный предмет.

multisdesc - используется синтаксическим анализатором для вывода списков объектов (подробнее описано здесь). По умолчанию возвращает краткое описание (sdesc) объекта. Если вы не собираетесь "дорабатывать напильником" синтаксический анализатор, это свойство вам не понадобится.

pluraldesc - возвращает краткое описание (название) предмета во множественном числе.

readdesc - описание, выдаваемое по умолчанию в качестве ответа на команду "прочитать". Это свойство необходимо определять для предметов, которые можно читать (например, книги, газеты, таблички и т. п.)

statusPrep - предлог по умолчанию, указывающий, как должно выводиться описание, если персонаж или другой предмет находится внутри данного предмета (используется, например, для описаний типа "Столовая, на стуле" или "Гараж, в машине"; для объекта, соответствующего стулу в первом примере, данное свойство возвращает предлог "на", а для машины во втором примере - предлог "в".

thatdesc - в зависимости от числа предмета выводит "эти" или "этот".

validActor - Возвращает true, если игрок может дать предмету команду. По умолчанию, дать команду можно только в случае, если предмет доступен (см. также метод isReachable). Метод является служебным и в общем случае не должен модифицироваться.

verGrab(obj), Grab(obj) - определяют реакцию предмета при попытке взять из него содержащийся в нем объект obj. Метод verGrab действует аналогично методам обработки глаголов с префиксом "ver" - если он выводит что-либо на экран, попытка взять предмет obj признается неудачной и дальнейшая обработка прекращается. Методы являются служебными и в общем случае не должны модифицироваться.

verifyRemove(actor) - проверяет, может ли персонаж actor взять данный предмет, или существуют ограничения со стороны объекта-контейнера, в котором этот предмет находится. Метод является служебным и в общем случае не должен модифицироваться.

weight - вес предмета (см. функцию addweight).


transparentItem

transparentItem: item. Объект-контейнер, содержимое которого видно, даже когда сам контейнер закрыт. При этом это содержимое будет недоступно, пока объект не откроют. Данный класс удобен для реализации, например, таких предметов, как стеклянные бутылки, содержимое которых (при закрытой бутылке) видно, но недоступно.


travelVerb

travelVerb: deepverb, darkVerb. Объекты-глаголы, которые обеспечивают перемещение игрока по комнатам игры. Для всех объектов-глаголов этого класса атрибут-флаг isTravelVerb равен true.


underHider

underHider: hider. Это объект, под которым можно прятать другие объекты. Спрятанные объекты можно обнаружить, только заглянув под данный объект; см. также описание класса hider для более подробной информации. Свойство underLoc каждого из спрятанных объектов должно ссылаться на скрывающий объект класса underHider.

Обратите внимание, что объект класса underHider не дает возможности игроку спрятать что-нибудь под ним в процессе игры. Этот класс предназначен скорее для того, чтобы автору игры было проще реализовать спрятанные предметы в процессе написания игры. Все, что вам требуется сделать, чтобы спрятать один предмет под другим - это объявить "объект-укрытие" как принадлежащий классу underHider, а затем определить объект для спрятанного предмета обычным образом, за исключением того, что для указания местоположения спрятанного предмета будет использоваться не свойство location, а свойство underLoc. Классы behindHider и searchHider работают аналогичным образом.

Объекты, скрываемые посредством объекта класса underHider, должны принадлежать классу hiddenItem.


vehicle

vehicle: item, nestedroom. Объект - транспортное средство, которое игрок, с одной стороны, может носить с собой, а с другой стороны, может забраться в/на него и использовать для перемещения по игровому миру. Находясь внутри транспортного средства, игрок может перемещаться только вместе с ним; чтобы перемещаться куда-либо еще, ему придется сначала вылезти из транспортного средства. Кроме того, разумеется, игрок не сможет забраться в транспортное средство, пока он держит его в руках. Для данного класса определен (равным true) атрибут-флаг isvehicle, помечающий объект-наследник как принадлежащий данному классу.


Стандартные определения объектов-глаголов

В нижеприведенном списке альтернативные лексические свойства (иначе говоря, слова-синонимы) для объектов-глаголов указаны через слэш (/) (при этом указаны лишь основные синонимы); разные синтаксические конструкии с участием объекта-глагола отделены друг от друга запятыми. В случае, если глагол используется в сочетании с объектами, в скобках за примером конструкции приводятся методы-верификаторы и обработчики, вызываемые для объекта (при этом их префиксы (do, verDo, io и verIo) опускаются; подробнее об обработчиках и верификаторах см. в разделе Создание собственных глаголов главы седьмой, а также главу 4.

(Примечание переводчика: в приведенных образцах синтаксических конструкций вместо использующихся в оригинале "прямых" и "косвенных" объектов (например, "расскажи 'прямому' объекту о 'косвенном' объекте") используются примеры с конкретными предметами. Хотя строгость изложения при этом несколько страдает, такой способ подачи материала показался мне более изящным (не говоря уже о том, что в некоторых случаях он позволил мне потешить мое извращенное чувство юмора;). Кроме того, для русского языка, в отличие от английского, предлог между "прямым" и "косвенным" объектами в некоторых случаях может отсутствовать. Если предлог необязателен, он приводится в квадратных скобках. Наконец, для некоторых (в основном системных) глаголов приводятся комментарии в фигурных скобках, описывающие назначение этих глаголов.)

againVerb: повтор/п {повторение последней введенной игроком команды}

askVerb: спросить/расспросить продавца о водке (AskAbout)

attachVerb: присоединить/прикрепить ксерокс к шреддеру (AttachTo)

attackVerb: убить/атаковать/напасть на училку [посредством] кирпича (AttackWith)

boardVerb: сесть в/залезть в танк (Board)

breakVerb: разбить/сломать телевизор (Board)

centerVerb: центр/центрировать прицел (Center)

cleanVerb: чистить/очистить кастрюлю (Clean), чистить/очистить зубы [посредством] щетки (CleanWith)

climbVerb: лезть по/карабкаться по шесту (Climb)

closeVerb: закрыть/прикрыть лавочку (Close)

debugVerb: debug {переводит игру в режим отладки. Для того, чтобы команда работала, игра должна быть соответствующим образом скомпилирована. Подробнее см. в документации по компилятору TADS.}

digVerb: копать/рыть котлован [посредством] экскаватора (DigWith)

drinkVerb: выпить/хлебнуть политурки (Drink)

dropVerb: выбросить/выложить деньги (Drop), выбросить/выложить воблу на газету (PutOn)

dVerb: вниз/вн

eatVerb: съесть,проглотить ежа (Eat)

eVerb: восток/в

fastenVerb: застегнуть/пристегнуть ремень (Fasten)

flipVerb: щелкнуть монету (Flip) {глагол "flip", который буквально переводится на русский как "щелкнуть", в английском обычно употребляется применительно к монете при игре "орел-решка".}

followVerb: следовать за соперником (Follow)

getOutVerb: слезть с/вылезти из/выйти из шкафа (Unboard)

giveVerb: дать/подарить цветы подруге (GiveTo)

helloVerb: привет/здравствуй

helpVerb: помощь {выводит краткую справку по IF-играм.}

inspectVerb: осмотреть/исследовать/осм статуэтку (Inspect)

inVerb: войти/зайти/внутрь

itallVerb: i_tall {"надстройка" над глаголом iVerb, используемая для вывода инвентаря игрока в "высоком" формате (т. е. каждый элемент списка выводится с новой строки). См. также iwideVerb.}

iVerb: инвентарь/и {выводит список предметов, которые несет игрок}

iwideVerb: i_wide {"надстройка" над глаголом iVerb, используемая для вывода инвентаря игрока в "широком" формате (т. е. в строчку через запятую). См. также itallVerb.}

jumpVerb: прыгнуть/подпрыгнуть, перепрыгнуть канаву (Jump)

justgoVerb: идти/пойти/бежать

knockVerb: постучать в ворота (Knock)

lieVerb: лечь на/улечься на еже (Lieon)

linksVerb: links {включает/отключает отображение гиперссылок (имеет смысл только для игр, написанных с использованием средств HTML-TADS).}

lockVerb: замкнуть/запереть камеру (Lock), замкнуть/запереть сундук [посредством] ключа (LockWith)

lookBehindVerb: посмотреть за/заглянуть за шкаф (LookBehind)

lookInVerb: посмотреть в/заглянуть в кастрюлю (Lookin)

lookThruVerb: посмотреть сквозь/посмотреть через бинокль (Lookthru)

lookUnderVerb: посмотреть под/заглянуть под танк (LookUnder)

lookVerb: смотреть/осмотреться/оглядеться/см

moveNVerb: двигать на север/двигать на с/толкать на с автомобиль (MoveN) Примечание: глаголы moveSVerb, moveEVerb, moveWVerb, moveNEVerb, moveNWVerb, moveSEVerb и moveSWVerb, соответствующие югу, востоку, западу, северо-востоку, северо-западу, юго-востоку и юго-западу, определяются аналогично.

moveVerb: двинуть/переместить/шевелить диван (Move), двинуть/переместить алкоголика [к] подъезду (MoveTo), двинуть/переместить/шевелить труп [посредством] палки (MoveWith)

nVerb: север/с

neVerb: северо-восток/св

nwVerb: северо-запад/с-з

openVerb: открыть бутылку (Open)

outVerb: выйти/покинуть/прочь

plugVerb: воткнуть/подсоединить/подключить штепсель в розетку (PlugIn)

pokeVerb: пихнуть соседа (Poke)

pullVerb: тянуть/потянуть/дернуть дверь (Pull)

pushVerb: нажать/толкать/надавить крышку (Push)

putVerb: поместить/положить/класть котлету в тарелку (PutIn), поместить/положить/класть голову на блюдо (PutOn)

quitVerb: выход {завершение игровой сессии}

razdets: раздеться/стриптиз

readVerb: читать/прочесть пасквиль (Read)

removeVerb: снять/снять с себя вошь (Unwear)

restartVerb: заново {перезапускает игру заново}

restoreVerb: восстановить/загрузить последнюю сохраненную игру (Restore) {восстанавливает сохраненную ранее игру}

standOnVerb: встать на/залезть на/забраться на стул (Standon)

standVerb: встать/стоять

saveVerb: сохранить/записать текущее состояние игры (Save) {сохраняет текущее состояние игры}

sayVerb: сказать/произнести "фразу, обязательно заключенную в двойные кавычки" (Say)

scoreVerb: счет/статус {выводит количество очков, набранных игроком}

scriptVerb: отчет имя файла отчета (Script) {начинает запись всех команд, вводимых игроком, и ответов игры, в специальный файл отчета (команда незаменима при отладке)}

screwVerb: привинтить/прикрутить крышку (Screw), привинтить/прикрутить гайку [посредством] ключа (ScrewWith)

seVerb: юго-восток/юв

searchVerb: искать в/обыскать карманы (Search)

showVerb: показать кость собаке (ShowTo)

sitVerb: сесть на пень (Siton)

sleepVerb: спать/уснуть/отдыхать

sVerb: юг/ю

swVerb: юго-запад/юз

takeVerb: взять/подобрать булыжник (Take), взять/подобрать деньги из кошелька (TakeOut), взять/подобрать книгу с полки (TakeOff)

talkVerb: поговорить с/поболтать с/побеседовать с палачом (Talk)

tellVerb: рассказать начальнику о неудаче (TellAbout)

terseVerb: кратко {переводит игру в "краткий" режим, при котором полные описания комнат отображаются только в тех случаях, когда игрок попадает в комнату впервые; см. также verboseVerb}}

throwVerb: кинуть/швырнуть/метнуть дротик в мишень (ThrowAt)

touchVerb: трогать/коснуться/пощупать нож (Touch)

turnOffVerb: выключить/деактивировать компьютер (Turnoff)

turnOnVerb: включить/активировать/запустить пылесос (Turnon)

turnVerb: повернуть/покрутить антенну (Turn), повернуть/покрутить коленвал [посредством] заводной рукоятки (TurnWith), повернуть/покрутить регулятор на максимум (TurnTo)

typeVerb: печатать текст на клавиатуре (TypeOn)

undoVerb: отмена/откат {отменяет последнюю команду игрока}

unfastenVerb: расстегнуть/отстегнуть шлем (Unfasten)

unlockVerb: отомкнуть/отпереть сундук (Unlock), отомкнуть/отпереть сейф [посредством] отмычки (UnlockWith)

unplugVerb: отсоединить/отключить кабель (Unplug), отсоединить/отключить компьютер от сети (UnplugFrom)

unscrewVerb: отвинтить/открутить/вывинтить лампочку (Unscrew), отвинтить/открутить/вывинтить винт [посредством] отвертки (UnscrewWith)

unscriptVerb: стопотчет/остотчет {прекращает запись отчета; см. также scriptVerb.}

uVerb: вверх/вв/подняться

verboseVerb: длинно/полно {переводит игру в "подробный" режим, при котором полные описания комнат отображаются во всех случаях, даже когда игрок заходит в комнату, где он уже был; см. также terseVerb}

versionVerb: версия {выводит данные о версии игры; эти данные задаются автором игры при помощи специального объекта version, определенного в файле std.t}

waitVerb: ждать/подождать

wearVerb: надеть/одеть кольчугу (Wear)

wVerb: запад/з

yellVerb: кричать/орать/вопить

yesVerb: да/нет {этот глагол реализует один из приколов ряда "классических" IF-игр: например, при попытке игрока, скажем, пересечь бурную реку отображался текст типа "Неужели ты думаешь, что не утонешь?" Если игрок в этом случае пытался ответить на это "да" или "нет", игра выводила текст "Это был риторический вопрос."}


Определение предлогов в стандартных библиотеках

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

aboutPrep: о/об/про

aroundPrep: вокруг

atPrep: у/возле

behindPrep: за

betweenPrep: между/промеж

dirPrep: север/юг/восток/запад/вверх/вниз/северовосток/св/северозапад/сз/юговосток/юв/югозапад/юз/с/ю/в/з/вв/вн

douPrep: до

goonPrep: по

inPrep: внутрь/в

fromPrep: из

offPrep: со/с/ссебя

onPrep: на

outPrep: наружу/вне

overPrep: над

thruPrep: через/сквозь

toPrep: к

toPrep: к

underPrep: под

withPrep: спомощью/припомощи


Краткий обзор определений, содержащихся в файле stdr.t

Примечание переводчика: оригинальная документация не содержит справочной информации по файлу stdr.t, однако, вспомнив о времени, потраченным мной в свое время на то, чтобы в нем разобраться, я решил дополнить данную главу соответствующим разделом.

Файл std.t (в русском варианте - stdr.t), по замыслу создателя TADS Майкла Робертса, должен содержать определения функций и объектов, которые, скорее всего, будут изменяться для каждой конкретной игры. В эти функции сведены, например, следующие действия: вывод сообщений в начале игры; реализация смерти игрока (вернее, главного персонажа); отображение информации о набранных игроком очках и т. д.

Ниже приведен список функций и объектов, определенных в stdr.t.

commandPrompt: function(code). Данная функция вызывается каждый раз сразу после ввода игроком очередной команды. По умолчанию, если интерпретатор поддерживает HTML-TADS, она просто возвращается к первоначальному шрифту, который использовался до того, как функция commandPrompt временно переключилась на шрифт, используемый для ввода команд ("TADS-Input"). Аргумент code позволяет организовать обмен данными между функцией commandPrompt и вызывающим ее кодом. По умолчанию эта возможность не используется.

commandPrompt: function(code). Данная функция выводит приглашение командной строки. В случае, если игра запущена при помощи интерпретатора, поддерживающего HTML-TADS, игрок сможет выбрать шрифт этого приглашения (это достигается тем, что функция переключает используемый шрифт на "TADS-Input", а этот шрифт может настраиваться игроком средствами интерпретатора). Аргумент code позволяет организовать обмен данными между функцией commandPrompt и вызывающим ее кодом. По умолчанию эта возможность не используется.

commonInit: function. Данная функция является вспомогательной и служит для того, чтобы избежать дублирования кода. При запуске игры вся инициализация осуществляется либо функцией init, либо initRestore в зависимости от способа запуска игры. Поскольку возможна ситуация, когда при инициализации игры необходимо выполнить определенную последовательность действий независимо от условий запуска, в stdr.t предусмотрена "заглушка" commonInit, в которой можно разместить общий инициализирующий код вместо того, чтобы отдельно размещать его и в init, и в initRestore. В обеих этих функциях уже предусмотрен вызов commonInit. По умолчанию же функция commonInit не выполняет никаких действий.

darkTravel: function. Функция вызывается, если игрок, находясь в темной комнате, пытается перейти в другую комнату, которая также не освещена (либо если он пытается в темной комнате двигаться в направлении, путь по которому закрыт). По умолчанию в этом случае просто выводится текст "Пошарив во тьме, ты так и не нашел дороги."

die: function. Данная функция вызывается, когда игрок умирает. По умолчанию, она сообщает игроку, насколько он преуспел в игре (путем отображения набранных им очков), и предлагает ему перезапустить игру, восстановить ранее сохраненную игру или выйти из программы.

displayImage: function(imageName, objectToCheck, centre). Функция выводит на экран изображение (графический файл с именем imageName). Параметр centre определяет, будет ли изображение центрироваться при выводе. В параметре objectToCheck можно передать функции объект, которому соответствует выводимое изображение; при этом для этого объекта поле imageSeen будет установлено равным true; при соответствующих настройках игры (см. объект global) это позволит выводить картинку для объекта только один раз - когда игрок впервые осматривает объект. Функция работает только в том случае, если игра идет в HTML-TADS.

displayLink: function(command, text). Функция выводит на экран HTML-ссылку, при этом text - это отображаемый на экране текст ссылки, а command - адрес ссылки. Функция работает только в том случае, если игра идет в HTML-TADS; в противном случае она просто отображает текст text.

eatDaemon: function(parm). Функция-демон, в основном аналогичная sleepDaemon, только отслеживающая, сколько времени (ходов) прошло с тех пор, как главный персонаж последний раз ел. Если он не ел слишком долго, то (после ряда предупреждений о необходимости принять пищу) главный персонаж умрет. См. также fooditem.

global: object. Объект, в который сведена большая часть настроек и параметров, относящихся ко всей игре в целом, как то: максимальное количество очков; текущее количество очков; текущее количество ходов; режим вывода описаний комнат (краткий или подробный) и др. Ниже приведен обзор свойств объекта (они перечислены в алфавитном порядке).

awakeTime - время (точнее, число ходов), прошедшее с момента последнего сна главного персонажа. По умолчанию оно установлено равным 0; если требуется, чтобы главный персонаж начинал игру уставшим, установите его большим. См. также sleepDaemon.

eatTime - максимальное число ходов, которое главный персонаж может обходиться без еды. Этот параметр используется в работе демона eatDaemon.

glpad - используется при обработке команды игрока для определения типа глагола (см. также свойство type объекта deepverb). Значение свойства меняется в ходе обработки команды синтаксическим анализатором. Менять его значение не рекомендуется.

lamplist - список всех источников света в игре. Этот список заполняется функцией preinit и служит для ускорения работы игры.

lastMealTime - время (число ходов), прошедшее с момента, когда главный персонаж последний раз ел. По умолчанию оно установлено равным 0; если требуется, чтобы главный персонаж начинал игру голодным, установите его большим. См. также eatDaemon.

maxscore - максимальное число очков, которое игрок может набрать в процессе игры. По умолчанию игрок может набрать 100 очков. Это число по умолчанию отображается в строке статуса игры, а также, как правило, выводится функцией scoreRank.

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

schanged - флаг, используемый при обработке команды игрока синтаксическим анализатором. Менять его значение не рекомендуется.

sleepTime - максимальное время бодрствования (число ходов, в четение которого главный персонаж может обходиться без сна). Этот параметр используется в работе демона sleepDaemon.

turnsofar - число ходов, сделанных игроком за время игры (на начало игры это поле по умолчанию равно нулю, а после каждого хода увеличивается на единицу функцией turncount).

verbose - Указывает способ вывода описаний комнат, в которые заходит игрок. Если это поле равно true, то подробное описание комнаты будет отображаться всякий раз, когда игрок в нее заходит; если поле имеет значение nil, то подробное описание будет выводиться только тогда, когда игрок попадает в комнату впервые. Значение этого свойства игрок может "переключать" при помощи команд VERBOSE и TERSE.

vinpadcont - флаг, указывающий, в каком падеже выводить названия предметов при перечислении (винительном или именительном). Изменять его значение не рекомендуется, т. к. в процессе игры его значение изменяется самой программой и во многом определяется самой логикой работы синтаксического анализатора. Данное свойство объекта global определено специально для руссифицированной версии.

goToSleep: function. Функция вызывается, когда игра принудительно отправляет главного персонажа спать. Подробнее см. функцию sleepDaemon.

init: function. Данная функция выполняет инициализацию игры при запуске последней. По умолчанию, она выводит вступительный текст к игре, данные о версии игры, запускает все необходимые демоны и запалы (по умолчанию запускаются три демона: turncount, sleepDaemon и eatDaemon), перемещает "стандартного" главного персонажа (объект Me) в комнату, которой по умолчанию соответствует объект startroom, выводит описание этой комнаты, инициализирует строку статуса, вызывает функцию initSearch, а также инициализирует генератор псевдослучайных чисел. См. также commonInit, initRestore.

initRestore: function(fname). Вызывается системой для инициализации игры вместо функции init, если игрок указал при запуске игры имя файла (параметр fname), из которого требуется восстановить сохраненную игру. Способ указания этого параметра зависит от конкретного интерпретатора (например, для DOS-версии можно задавать имя файла в качестве параметра командной строки). По умолчанию данная функция просто восстанавливает сохраненную позицию игры из указанного в качестве параметра файла. См. также commonInit.

Me: basicMe. Объект, соответствующий главному персонажу. По умолчанию этот объект просто наследует все свойства класса basicMe, но автор игры может как доопределить дополнительные свойства, так и использовать другой объект для главного персонажа (при помощи функции parserSetMe). В стандартной библиотеке stdr.t определен также набор "форматных" строк, если к главному персонажу необходимо обращаться на "Вы" (подробнее о форматных строках см. класс movableActor).

numObj: basicNumObj. См. класс basicNumObj.

pardon: function. Эта функция вызывается всякий раз, когда игрок в ответ на приглашение игры вводит пустую строку. Как правило, ее используют для вывода соответствующего сообщения; по умолчанию выводится фраза, "Вы что-то сказали?".

preinit: function. Данная функция вызывается компилятором TADS после компиляции игры, но до того, как игра записывается в окончательный бинарный файл игры (с расширением .gam). preinit выполняет все действия по инициализации, которые могут быть выполнены "статически" до записи файла игры. За счет этого сокращается время загрузки игры, т. к. часть действий оказывается выполненной заблаговременно.

По умолчанию, данная функция заносит все объекты, которые могут служить источниками света (свойство islamp для них равно true) в список lamplist объекта global. Программа-интерпретатор обращается к этому списку в процессе игры, чтобы проверить, имеются ли в "темной" комнате источники света. Кроме того, эта функция производит вызов initSearch.

scoreRank: function. Функция служит для отображения количества очков, которые игрок набрал в процессе игры. По умолчанию выводит сообщение "В сумме за X ходов, вы достигли счета в Y единиц из возможных Z", где X - число ходов, сделанных игроком, Y - число набранных им очков, а Z - максимально возможное число очков (определяется полем maxscore объекта global).

sleepDaemon: function(parm). Функция-демон, отслеживающая, сколько времени (ходов) главный персонаж провел без сна. По умолчанию, при превышении некоего количества ходов, определяемого свойством sleepTime объекта global, будет выдано сообщение о том, что главный персонаж настолько устал, что уснул на месте (при этом все предметы, которые он нес с собой, окажутся рассыпанными по комнате, в которой он уснул). До того, как данный предел будет достигнут, будет выдано несколько предупреждений (по умолчанию, за 35, 25, 15, 10 и 5 ходов до "принудительного" засыпания игрока). По умолчанию данный демон запускается из функции init. Аргумент parm позволяет организовать обмен данными между программой и демоном путем передачи и/или возврата какого-либо значения/переменной. В версии демона по умолчанию этот параметр никак не используется.

strObj: basicStrObj. См. класс basicStrObj.

terminate: function. Данная функция вызывается непосредственно перед окончанием игры. Как правило, в ней выводится прощальное сообщение; по умолчанию в ней не выполняется никаких действий. Обратите внимание, что вызов этой функции осуществляется непосредственно перед тем, как программа-интерпретатор заканчивает свою работу; ее вызов никак не связан со смертью главного персонажа, перезапуском игры или другими действиями игрока.

version: object. В данном объекте обычно определяют краткую информацию об игре (наименование, версия, автор...), которая будет выводиться в самом начале игры, а также по команде версия. Всю необходимую информацию заносят в свойство sdesc данного объекта.






Ненавижу определения.
БЕНДЖАМИН ДИЗРАЭЛИ (BENJAMIN DISRAELI), Вивиан Грей (1826)


Приложение A Содержание Приложение C