А почему поверхность при ее осмотре не выписывает список предметов, которые лежат на ней? И контейнеры тоже...
Гранд, может, доточить библиотеку? Какое-то глобальное упущение.
Пример. На столике лежит ключ. Если я напишу осмотреть столик, то выведется 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)
Неактивен