eyes: fixeditem, floatingItem
noun = 'глаза' 'глаз' 'глазам' 'глазами' 'глазах' 'глазою' 'глазам#d' 'глазами#t' 'глазою#t'
sdesc = "глаза"
rdesc = "глаз"
ddesc = "глазам"
vdesc = "глаза"
tdesc = "глазами"
pdesc = "глазах"
ldesc = "Поблизости нет зеркала"
;Я проверял дебаггером, объект eyes присутствует в списке global.floatingList, наряду с Me и theFloor. Но те объекты откликаются, а на команду "осм глаза" я получаю "Я не вижу здесь объект "глаза".
![]()
Я так понимаю, ошибку возвращает сам интерпретатор TADS, как это исправить я вообще не понимаю... ![]()
Помогите!
Неактивен
Хрень какая-то. По идее, все floatingItem должны автоматом добавляться к списку видимых объектов, иначе зачем они нужны?
Более того, у класса deepverb есть метод validDoList следующего содержания:
validDoList(actor, prep, iobj) =
{
local ret;
local loc;
loc := actor.location;
while (loc.location)
loc := loc.location;
ret := visibleList(actor, actor) + visibleList(loc, actor)
+ global.floatingList+loc;
return ret;
}Т.е. вроде как все добавляется... (только вот в библиотеке я не увидел где используется этот самый validDoList)
А проблема решилась только добавлению к объекту "глаза" следующего кода (нагло стыренного из theFloor):
location = {
return parserGetMe().location;
}
locationOK = trueТ.е. мы явно перемещаем объект в локацию с ГГ. Как-то не комильфо... Но работает. Пока будет так.
Гранд, что скажешь?
Неактивен
Тебя не глючит. Парсеру, чтобы определить доступность объекта, нужно убедиться, что он в одной локации с персонажем.
Надо бы этот метод (location) засунуть в объект floatingItem.
Неактивен
Gremour написал:
Тебя не глючит. Парсеру, чтобы определить доступность объекта, нужно убедиться, что он в одной локации с персонажем.
Надо бы этот метод (location) засунуть в объект floatingItem.
Тогда floatingList становится нафик не нужен. Зачем он тогда?
Неактивен
Это нужно спрашивать у Майка Робертса. Вот как он сам это описал.
/* * floatingItem: object * * This class doesn't do anything apart from mark an object as having a * variable location property. It is necessary to mark all such * items by making them a member of this class, so that the objects are * added to global.floatingList, which is necessary so that floating * objects are included in validDoList and validIoList values (see * the deepverb class for a description of these methods). */ class floatingItem: object ;
Почему он сразу не добавил скрипт с локацией, могу только догадываться. Например, кому может быть нужно, чтобы объект был не там где ГП, а там где его нет.
Неактивен
fireton написал:
Хрень какая-то. По идее, все
floatingItemдолжны автоматом добавляться к списку видимых объектов, иначе зачем они нужны?
fireton написал:
(только вот в библиотеке я не увидел где используется этот самый
validDoList)
validDo и validIo - методы, осуществляющие предварительную валидацию соответственно "прямого" и "косвенного" объекта, а validDoList и validIoList - их аналоги, осуществляющие "предвалидацию". validDoList и validIoList введены были в свое время, собственно, для повышения производительности (правда, я не уверен, что эта проблема осталась актуальной при современных вычислительных мощностях). Подробнее см. в мануале - глава "Последовательностьсинтаксического анализа). Можно попробовать поэкспериментировать - определить объект с методом
location={return parserGetMe().locationи проверить, работает ли он в этом случае.
fireton написал:
Тогда floatingList становится нафик не нужен. Зачем он тогда?
В принципе действительно можно без него обойтись. В свое время, когда я только начинал работать в TADS и у меня не хватило терпения разбираться с floatingItem, я просто перемещал нужные объекты в помещение в методе enterRoom;).
Неактивен
В принципе действительно можно без него обойтись. В свое время, когда я только начинал работать в TADS и у меня не хватило терпения разбираться с floatingItem, я просто перемещал нужные объекты в помещение в методе enterRoom;)
Ерунда заключается в том, что в таком случае объект не будет буквально "присутствовать во всех комнатах". Он будет "следовать за игроком". Если другой Actor захочет с ним взаимодействовать, то ничего не получится... Например, "Петя, пойди на север и сядь на пол" не сработает. ![]()
Неактивен
Вот правильное решение проблемы:
modify thing
isReachable(actor) = {
local loc;
/* make sure the actor's location has a reachable list */
if (actor.location = nil or actor.location.reachable = nil)
return nil;
/* if the object is in the room's 'reachable' list, it's reachable */
if (find(actor.location.reachable, self) <> nil)
return true;
/* если объект "плавающий", то он достижим всегда */
if (find(global.floatingList, self) <> nil)
return true;
/*
* If the object's container's contents are reachable, and the
* container is reachable, the object is reachable.
*/
loc := self.location;
if (loc = nil)
return nil;
if (loc = actor or loc = actor.location)
return true;
if (loc.contentsReachable)
return loc.isReachable(actor);
return nil;
}
;Андрей, что думаешь?
Неактивен
ИМХО, то, что вы ожидаете от floatingItem, следует прописать в новый класс и назвать его omnipresent.
floatingItem лучше оставить как есть. Вот что может случиться, если изменить код указанным fireton'ом образом : главного персонажа Янека Изельдорфа из вступления мы меняем на Ивана Дубинина, которого продолжают преследовать глаза и уши Янека. После чего автор приходит на форум и спрашивает в чем причина этого незадокументированного в мануале ужастика.
Лучше недописать и оставить автору пространство для маневра. Чаще всего предмет присутствует не везде, а только в определенных местах, что и прописывается в методе location.
Кстати, кто знает, что выдает parserGetMe(), когда команду выполняет NPC?
Неактивен
Вообще, эти "плавающие" объекты - скользкая тема...
Хотелось бы иметь объекты:
а. "прикрепленные" к определенному актеру.
б. присутствующие на определенной группе локаций. Например, мне так и не удалось модифицировать theFloor таким образом, чтобы внутри помещений мне писали "ты сидишь на полу", а на открытых пространствах - "ты сидишь на земле"...
Неактивен
fireton написал:
Например, мне так и не удалось модифицировать theFloor таким образом, чтобы внутри помещений мне писали "ты сидишь на полу", а на открытых пространствах - "ты сидишь на земле"...
Делаешь
class openroom: room
isopen=true
;
modify theFloor
location =
{
if (!parserGetMe().location.isopen)
{
if (parserGetMe().location = self && )
return self.sitloc;
else
return parserGetMe().location;
}
else return nil;
}
;И прописываешь theGround, аналогичный земле, только название с сообщениями другие, а "if (!parserGetMe().location.isopen)" без восклицательного знака.
Неактивен
И прописываешь theGround, аналогичный земле, только название с сообщениями другие, а "if (!parserGetMe().location.isopen)" без восклицательного знака.
Спасибо, я попробую так. Можно еще сделать два объекта и прописать у них isReachable соответствующим образом. Единственный момент, что все равно придется прописывать два объекта. Но оно, кажется, и к лучшему...
Неактивен