А почему поверхность при ее осмотре не выписывает список предметов, которые лежат на ней? И контейнеры тоже...
Гранд, может, доточить библиотеку? Какое-то глобальное упущение.
Пример. На столике лежит ключ. Если я напишу осмотреть столик
, то выведется ldesc
столика, но не напишется, что "на столике лежит ключ". Что, в целом, неправильно...
Неактивен
Если вообще не задавать ldesc
для поверхностей, то как раз и выводится "На столе вы видите...".
Подразумевается, что если автор перекрывает ldesc, то он сам разберется, как описывать предметы на поверхности (что логично). Самый простой вариант такой:ldesc =
{
"Невысокий резной стол из темного дерева. ";
inherited.ldesc;
}
Тогда сообщение при осмотре будет такое:Невысокий резной стол из темного дерева. На столе вы видите ключ.
Отредактировано Flint (30.01.2008 15:31)
Неактивен
когда кладу НА сейф ключ, он перестаёт быть не только виден, но и доступен. библиотек не редактировал.
/* Это просто комментарий, такой же, как, например, в языке Си */ /* Эти две строчки разрешают использовать возможности HTML в нашей игре */ #define USE_HTML_STATUS #define USE_HTML_PROMPT #include <advr.t> /* включить файл с основными определениями объектов для текстовых квестов (русская версия)*/ #include <stdr.t> /* включить файл определений стандартных функций, вызываемых при старте (русская версия) */ #include <errorru.t> /* включить файл с русскими сообщениями об ошибках */ /************** поля *************************************************************************************************/ startroom: room /* по умолчанию, игра начинается в комнате с названием startroom */ sdesc = "<b>стартовая локация (a1)</b>" /* краткое опиание комнаты (от английского Short DESCription) */ ldesc = "Это моя первая локация." north = a2room east = b1room ; a2room:room sdesc = "<b>северная локация (a2)</b>" ldesc = "Вот мои первые объекты:" south = startroom east = b2room ; b1room:room sdesc = "<b>восточная локация (b1)</b>" ldesc = "Ещё одна заморочка- ксиззи." west = startroom north = b2room ; b2room:room sdesc = "<b>северо-восточная локация (b2)</b>" ldesc = "Комната для роботов, которым нечем заняться." west = a2room south = b1room enterRoom( actor ) = { if ( not self.isseen ) notify( robot, &actorDaemon, 0 ); pass enterRoom; } ; /************************************** качели ************************************************************************/ table_wood: surface, fixeditem sdesc = "дубовый стол" rdesc = "дубового стола" ddesc = "дубовому столу" vdesc = "дубовый стол" tdesc = "дубовым столом" pdesc = "дубовом столе" noun = 'стол' 'стола' 'столу' 'столом' 'столе' 'столу#d' 'столом#t' adjective = 'дубовый' 'дубового' 'дубовому' 'дубовым' 'дубовом' 'дубовому#d' 'дубовым#t' isListed = true isHim = true location = a2room ldesc = { "Стол представляет из себя квадратную крышку на четырёх ножках."; inherited.ldesc; } ; table_glass: surface, fixeditem sdesc = "стеклянный стол" rdesc = "стеклянного стола" ddesc = "стеклянному столу" vdesc = "стеклянный стол" tdesc = "стеклянным столом" pdesc = "стеклянном столе" noun = 'стол' 'стола' 'столу' 'столом' 'столе' 'столу#d' 'столом#t' adjective = 'стеклянный' 'стеклянного' 'стеклянному' 'стеклянным' 'стеклянном' 'стеклянному#d' 'стеклянным#t' isListed = true isHim = true location = a2room ldesc = { "Уродливый лабораторный массивный стол. Толстое мутное стекло имеет зеленоватый оттенок."; inherited.ldesc; } ; box: keyedLockable, container, surface, fixeditem, openable sdesc = "надёжный сейф" rdesc = "надёжного сейфа" ddesc = "надёжному сейфу" vdesc = "надёжный сейф" tdesc = "надёжным сейфом" pdesc = "надёжном сейфе" noun = 'сейф' 'сейфа' 'сейфу' 'сейфом' 'сейфе' 'сейфу#d' 'сейфом#t' adjective = 'надежный' 'надежного' 'надежному' 'надежным' 'надежном' 'надежному#d' 'надежным#t' isListed = true mykey= key isHim = true isopen = nil islocked = true location = table_wood ; /********* вещи ****************************************************************************************************/ apple_green: item sdesc = "зелёное яблоко" rdesc = "зелёного яблока" ddesc = "зелёному яблоку" vdesc = "зелёное яблоко" tdesc = "зелёным яблоком" pdesc = "зелёном яблоке" noun = 'яблоко' 'яблока' 'яблоку' 'яблоком' 'яблоку#d' 'яблоком#t' 'яблоке' adjective = 'зеленое' 'зеленого' 'зеленому' 'зеленым' 'зеленом' 'зеленому#d' 'зеленым#t' isHim = true location = box ; apple_red: item sdesc = "красное яблоко" rdesc = "красного яблока" ddesc = "красному яблоку" vdesc = "красное яблоко" tdesc = "красным яблоком" pdesc = "красном яблоке" noun = 'яблоко' 'яблока' 'яблоку' 'яблоком' 'яблоку#d' 'яблоком#t' 'яблоке' adjective = 'красное' 'красного' 'красному' 'красным' 'красном' 'красному#d' 'красным#t' isHim = true location = box ; key: keyItem sdesc = "стальной ключ" rdesc = "стального ключа" ddesc = "стальному ключу" vdesc = "стальной ключ" tdesc = "стальным ключом" pdesc = "стальном ключе" noun = 'ключ' 'ключа' 'ключу' 'ключом' 'ключу#d' 'ключом#t' 'ключе' adjective = 'стальной' 'стального' 'стальному' 'стальным' 'стальном' 'стальному#d' 'стальным#t' isHim = true location = b2room ; /********************************** актёры ****************************************************************************/ robot: Actor noun = 'робот' 'робота' 'роботу' 'роботом' 'роботе' 'роботу#d' 'роботом#t' adjective = 'скрипучий' 'скрипучего' 'скрипучему' 'скрипучим' 'скрипучем' 'скрипучему#d' 'скрипучим#t' sdesc = "скрипучий робот" rdesc = "скрипучего робота" ddesc = "скрипучему роботу" vdesc = "скрипучего робота" tdesc = "скрипучим роботом" pdesc = "скрипучем роботе" isHim = true isawake = true location = b2room actorDaemon = { if ( self.location <> Me.location or not self.isawake ) return;//!!!!!!!!!!!!! вычислять вместо Me "\b"; switch( rand( 5 ) ) { case 1: "робот ходит туда-сюда."; break; case 2: "робот насвистывает какую-то мелодию."; break; case 3: "робот напевает популярную песенку."; break; case 4: "робот выстукивает чечётку. "; break; case 5: "робот тихонько поскрипывает."; break; } } ; /********************************* особые команды ********************************************************************/ magicVerb_1: deepverb verb = 'xyzzy' 'ксиззи' sdesc = "xyzzy" action( actor ) = { if ( actor.location = b1room ) { "Внезапно пещеру заволакивает облаком оранжевого дыма. Когда оно рассеивается, ты внезапно обнаруживаешь, что находишься в комнате b2!"; actor.moveInto(b2room); } else if (actor.location = b2room) { "Внезапно ты чувствуешь головокружение, а комната все быстрее и быстрее начинает вращаться вокруг тебя. Более-менее придя в себя, ты обнаруживаешь, что находишься в комнате b1! "; actor.moveInto( b1room ); } else "Ничего не происходит."; } ; magicVerb_2: deepverb verb = 'глаголы' 'список глаголов' sdesc = "глаголы" action( actor ) = { local o := firstobj(deepverb); "Список глаголов:\n"; while (o<>nil) { "\n<<o.sdesc>>\n"; o := nextobj(o, deepverb); } } ;
Неактивен
Не проверял, но на первый взгляд проблема в изобилии классов для сейфа. Он в первую очередь контейнер, а потом уже поверхность. В плане "нахождения" "на" и "в" реализованы одинаково, и поэтому когда кладешь что-то на сейф, оно оказывается внутри. Либо эта ситуация вообще неадекватно обрабатывается.
Неактивен
хм... В запертый сейф положить ничего нельзя, а НА него- можно. если НА него положить ключ- кранты. С не-запертым сейфом- проще:
>з
северная локация (a2)
Ты видишь здесь дубовый стол и стеклянный стол. На дубовом столе ты видишь надёжный сейф.
>отпереть сейф
(с помощью стального ключа)
Ты открыл надёжный сейф стальным ключом.
>открыть сейф
Открыв надёжный сейф, ты обнаружил зелёное яблоко и красное яблоко.
>положить ключ на сейф
Готово.
>осм
северная локация (a2)
Вот мои первые объекты:
Ты видишь здесь дубовый стол и стеклянный стол. На дубовом столе ты видишь надёжный сейф. На надёжном сейфе ты видишь зелёное яблоко, красное яблоко и стальной ключ.
>осм сейф
Надёжный сейф открыт. В надёжном сейфе ты видишь зелёное яблоко, красное яблоко и стальной ключ.
в-общем, видимо, контейнер имеющий поверхность, невозможно сделать?
Неактивен
GrAndrey написал:
Не проверял, но на первый взгляд проблема в изобилии классов для сейфа. Он в первую очередь контейнер, а потом уже поверхность. В плане "нахождения" "на" и "в" реализованы одинаково, и поэтому когда кладешь что-то на сейф, оно оказывается внутри.
Да, похоже именно так и есть.
Самый простой вариант (особенно с точки зрения новичка;) - убрать surface из списка классов.
И еще такой момент: у тебя действительно явный избыток классов. Определение сейфа можно сократить до
box: keyedLockable, fixeditem
поскольку в данном случае container и openable ничего нового не внесут (keyedLockable - наследник этих классов).
Неактивен
спасибо. действительно, список классов был избыточен. положить что-либо НА сейф, В котором есть что-то другое, можно вполне корректно, если представить сейф двумя объектами: сейф_поверхн и сейф_контейн. как конкретно организовать обработку такого случая- пока не разобрался. видимо, придётся переопределять какие-то библиотечные функции.
собственно, почему я к этому сейфу 'привязался'- на данном этапе мне интересно просто 'ковырять' движок. идей по созданию игры пока нет. а так, конечно, на РТАДСе можно реализовать, видимо, любую идею: лёгкие 'особенности' движка- не помеха. он прост в использовании и имеет достаточно широкие возможности.
Неактивен
Да, нужны два объекта - "сейф" и "сейфовая ячейка". Некоторые действия над сейфом переадресовывать ячейке, а многие над ячейкой - сейфу.
Неактивен
GrAndrey написал:
Да, нужны два объекта - "сейф" и "сейфовая ячейка". Некоторые действия над сейфом переадресовывать ячейке, а многие над ячейкой - сейфу.
а насколько это сложно? не будет ли затруднительно выложить пример, где сейф можно отпереть/запереть, открыть/закрыть, ложить ключи и яблоко как В сейф, так и НА него?
Неактивен
noname написал:
GrAndrey написал:
Да, нужны два объекта - "сейф" и "сейфовая ячейка". Некоторые действия над сейфом переадресовывать ячейке, а многие над ячейкой - сейфу.
а насколько это сложно? не будет ли затруднительно выложить пример, где сейф можно отпереть/запереть, открыть/закрыть, ложить ключи и яблоко как В сейф, так и НА него?
Ну, примерно вот так:
Safe: surface, fixedItem // Сейф для укладки "на сейф"
name='сейф'
sdesc="сейф"
ldesc="Мощный металлический шкаф с широкой поверхностью сверху и сейфовой ячейкой посередине."
location=startroom
// Переадресация на сейфовую ячейку
doOpen -> SafeInside //Открыть
doClose -> SafeInside // Закрыть
doLock -> SafeInside // Запереть
doLockWith -> SafeInside // Запереть при помощи...
doUnlock -> SafeInside // Отпереть
doUnlockWIth -> SafeInside // Отпереть при помощи...
ioPutIn -> SafeInside // Положить в...
;
SafeInside: keyedLockable, fixedItem // Сейфовая ячейка для укладки "в сейф"
name='ячейка'
adjective='сейфовая'
sdesc="сейфовая ячейка"
ldesc="Сейфовая ячейка посередине мощного металлического шкафа."
location=startroom
// Переадресация на сейф
ioPutOn -> Safe // Положить на...
;
-> - краткая форма записи переадресации глагола, говорящая о том, что для глагола, стоящего слева от "стрелки", будет вызываться набор соответствующих методов-верификаторов и методов действий объекта, стоящего справа от "стрелки". Т. е., скажем,
doClose -> SafeInside
аналогично записи
verDoClose(actor)={SafeInside.verDoClose(actor);}
doClose(actor)={SafeInside.doClose(actor);}
Отредактировано uux (06.02.2009 01:40)
Неактивен