Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

   #1
10.01.2008 00:28

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

floatingItem не находится!

Код:

eyes: fixeditem, floatingItem
 noun = 'глаза' 'глаз' 'глазам' 'глазами' 'глазах' 'глазою' 'глазам#d' 'глазами#t' 'глазою#t'
    sdesc = "глаза"
 rdesc = "глаз"
 ddesc = "глазам"
 vdesc = "глаза"
 tdesc = "глазами"
 pdesc = "глазах"
 
 ldesc = "Поблизости нет зеркала"
;

Я проверял дебаггером, объект eyes присутствует в списке global.floatingList, наряду с Me и theFloor. Но те объекты откликаются, а на команду "осм глаза" я получаю "Я не вижу здесь объект "глаза". sad sad sad

Я так понимаю, ошибку возвращает сам интерпретатор TADS, как это исправить я вообще не понимаю... sad

Помогите!

Неактивен

   #2
10.01.2008 00:43

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: floatingItem не находится!

Хрень какая-то. По идее, все 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

Т.е. мы явно перемещаем объект в локацию с ГГ. Как-то не комильфо... Но работает. Пока будет так.

Гранд, что скажешь?

Неактивен

   #3
10.01.2008 03:25

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 235

Re: floatingItem не находится!

Тебя не глючит. Парсеру, чтобы определить доступность объекта, нужно убедиться, что он в одной локации с персонажем.

Надо бы этот метод (location) засунуть в объект floatingItem.

Неактивен

   #4
10.01.2008 03:35

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: floatingItem не находится!

Gremour написал:

Тебя не глючит. Парсеру, чтобы определить доступность объекта, нужно убедиться, что он в одной локации с персонажем.
Надо бы этот метод (location) засунуть в объект floatingItem.

Тогда floatingList становится нафик не нужен. Зачем он тогда?

Неактивен

   #5
10.01.2008 04:38

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: floatingItem не находится!

Это нужно спрашивать у Майка Робертса. Вот как он сам это описал. 

Код:

/*
 *  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
;

Почему он сразу не добавил скрипт с локацией, могу только догадываться. Например, кому может быть нужно, чтобы объект был не там где ГП, а там где его нет.

Неактивен

   #6
10.01.2008 06:44

uux
Участник (+658, -37)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1533

Re: floatingItem не находится!

fireton написал:

Хрень какая-то. По идее, все floatingItem должны автоматом добавляться к списку видимых объектов, иначе зачем они нужны?

fireton написал:

(только вот в библиотеке я не увидел где используется этот самый validDoList)

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

Код:

location={return parserGetMe().location

и проверить, работает ли он в этом случае.

fireton написал:

Тогда floatingList становится нафик не нужен. Зачем он тогда?

В принципе действительно можно без него обойтись. В свое время, когда я только начинал работать в TADS и у меня не хватило терпения разбираться с floatingItem, я просто перемещал нужные объекты в помещение в методе enterRoom;).

Неактивен

   #7
10.01.2008 12:16

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: floatingItem не находится!

В принципе действительно можно без него обойтись. В свое время, когда я только начинал работать в TADS и у меня не хватило терпения разбираться с floatingItem, я просто перемещал нужные объекты в помещение в методе enterRoom;)

Ерунда заключается в том, что в таком случае объект не будет буквально "присутствовать во всех комнатах". Он будет "следовать за игроком". Если другой Actor захочет с ним взаимодействовать, то ничего не получится... Например, "Петя, пойди на север и сядь на пол" не сработает. sad

Неактивен

   #8
10.01.2008 18:28

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: floatingItem не находится!

Вот правильное решение проблемы:

Код:

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;
 }
;

Андрей, что думаешь?

Неактивен

   #9
10.01.2008 19:27

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: floatingItem не находится!

ИМХО, то, что вы ожидаете от floatingItem, следует прописать в новый класс и назвать его omnipresent.
floatingItem лучше оставить как есть. Вот что может случиться, если изменить код указанным fireton'ом образом : главного персонажа Янека Изельдорфа из вступления мы меняем на Ивана Дубинина, которого продолжают преследовать глаза и уши Янека. После чего автор приходит на форум и спрашивает в чем причина этого незадокументированного в мануале ужастика.
Лучше недописать и оставить автору пространство для маневра. Чаще всего предмет присутствует не везде, а только в определенных местах, что и прописывается в методе location.
Кстати, кто знает, что выдает parserGetMe(), когда команду выполняет NPC?

Неактивен

   #10
10.01.2008 19:35

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: floatingItem не находится!

Вообще, эти "плавающие" объекты - скользкая тема...

Хотелось бы иметь объекты:

а. "прикрепленные" к определенному актеру.

б. присутствующие на определенной группе локаций. Например, мне так и не удалось модифицировать theFloor таким образом, чтобы внутри помещений мне писали "ты сидишь на полу", а на открытых пространствах - "ты сидишь на земле"...

Неактивен

   #11
10.01.2008 20:33

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: floatingItem не находится!

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)" без восклицательного знака.

Неактивен

   #12
10.01.2008 21:12

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: floatingItem не находится!

И прописываешь theGround, аналогичный земле, только название с сообщениями другие, а "if (!parserGetMe().location.isopen)" без восклицательного знака.

Спасибо, я попробую так. Можно еще сделать два объекта и прописать у них isReachable соответствующим образом. Единственный момент, что все равно придется прописывать два объекта. Но оно, кажется, и к лучшему...

Неактивен

   #13
10.01.2008 21:14

uux
Участник (+658, -37)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1533

Re: floatingItem не находится!

GrAndrey написал:

Кстати, кто знает, что выдает parserGetMe(), когда команду выполняет NPC?

Все равно текущего ГП.

Неактивен

Powered by PunBB
© copyright 2001–2018 iFiction.Ru