Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
30.01.2008 14:38

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

Тон

Поверхности и контейнеры

А почему поверхность при ее осмотре не выписывает список предметов, которые лежат на ней? И контейнеры тоже...
Гранд, может, доточить библиотеку? Какое-то глобальное упущение.

Пример. На столике лежит ключ. Если я напишу осмотреть столик, то выведется ldesc столика, но не напишется, что "на столике лежит ключ". Что, в целом, неправильно...

Неактивен

0    0    #2
30.01.2008 15:30

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Поверхности и контейнеры

Если вообще не задавать ldesc для поверхностей, то как раз и выводится "На столе вы видите...".
Подразумевается, что если автор перекрывает ldesc, то он сам разберется, как описывать предметы на поверхности (что логично). Самый простой вариант такой:

ldesc =
{
  "Невысокий резной стол из темного дерева. ";
  inherited.ldesc;
}


Тогда сообщение при осмотре будет такое:
Невысокий резной стол из темного дерева. На столе вы видите ключ.

Отредактировано Flint (30.01.2008 15:31)

Неактивен

0    0    #3
30.01.2008 16:06

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

Тон

Re: Поверхности и контейнеры

Ой. Спасибо. Я балбес.

Неактивен

0    0    #4
31.01.2008 03:59

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

меньше слов

Re: Поверхности и контейнеры

Традиционный вариант:

ldesc =
{
  "Невысокий резной стол из темного дерева. ";
  pass ldesc;
}

Неактивен

0    0    #5
31.01.2008 14:59

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Поверхности и контейнеры

Да, но inherited универсальнее тем, что не прекращает обработку и можно что-нибудь вывести еще и после списка предметов.

Отредактировано Flint (31.01.2008 15:00)

Неактивен

0    0    #6
02.02.2009 17:40

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Поверхности и контейнеры

когда кладу НА сейф ключ, он перестаёт быть не только виден, но и  доступен. библиотек не редактировал.

Код:

/* Это просто комментарий, такой же, как, например, в языке Си */ 
/* Эти две строчки разрешают использовать возможности 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);
    }
  }
;

Неактивен

0    0    #7
02.02.2009 18:01

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

меньше слов

Re: Поверхности и контейнеры

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

Неактивен

0    0    #8
02.02.2009 18:13

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Поверхности и контейнеры

хм... В запертый сейф положить ничего нельзя, а НА него- можно. если НА него положить ключ- кранты. С не-запертым сейфом- проще:


северная локация (a2)
Ты видишь здесь дубовый стол и стеклянный стол. На дубовом столе ты видишь надёжный сейф.

>отпереть сейф
(с помощью стального ключа)
Ты открыл надёжный сейф стальным ключом.

>открыть сейф
Открыв надёжный сейф, ты обнаружил зелёное яблоко и красное яблоко.

>положить ключ на сейф
Готово.

>осм
северная локация (a2)
Вот мои первые объекты:
Ты видишь здесь дубовый стол и стеклянный стол. На дубовом столе ты видишь надёжный сейф. На надёжном сейфе ты видишь зелёное яблоко, красное яблоко и стальной ключ.

>осм сейф
Надёжный сейф открыт. В надёжном сейфе ты видишь зелёное яблоко, красное яблоко и стальной ключ.

в-общем, видимо, контейнер имеющий поверхность, невозможно сделать?

Неактивен

0    0    #9
02.02.2009 18:16

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

Re: Поверхности и контейнеры

GrAndrey написал:

Не проверял, но на первый взгляд проблема в изобилии классов для сейфа. Он в первую очередь контейнер, а потом уже поверхность. В плане "нахождения" "на" и "в" реализованы одинаково, и поэтому когда кладешь что-то на сейф, оно оказывается внутри.

Да, похоже именно так и есть.

Самый простой вариант (особенно с точки зрения новичка;) - убрать surface из списка классов.

И еще такой момент: у тебя действительно явный избыток классов. Определение сейфа можно сократить до

Код:

box: keyedLockable, fixeditem

поскольку в данном случае container и openable ничего нового не внесут (keyedLockable - наследник этих классов).

Неактивен

0    0    #10
03.02.2009 19:48

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Поверхности и контейнеры

спасибо. действительно, список классов был избыточен. положить что-либо НА сейф, В котором есть что-то другое, можно вполне корректно, если представить сейф двумя объектами: сейф_поверхн и сейф_контейн. как конкретно организовать обработку такого случая- пока не разобрался. видимо, придётся переопределять какие-то библиотечные функции.

собственно, почему я к этому сейфу 'привязался'- на данном этапе мне интересно просто 'ковырять' движок. идей по созданию игры пока нет. а так, конечно, на РТАДСе можно реализовать, видимо, любую идею: лёгкие 'особенности' движка- не помеха. он прост в использовании и имеет достаточно широкие возможности.

Неактивен

0    0    #11
03.02.2009 20:36

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

меньше слов

Re: Поверхности и контейнеры

Да, нужны два объекта - "сейф" и "сейфовая ячейка". Некоторые действия над сейфом переадресовывать ячейке, а многие над ячейкой - сейфу.

Неактивен

0    0    #12
06.02.2009 00:39

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Поверхности и контейнеры

GrAndrey написал:

Да, нужны два объекта - "сейф" и "сейфовая ячейка". Некоторые действия над сейфом переадресовывать ячейке, а многие над ячейкой - сейфу.

а насколько это сложно? не будет ли затруднительно выложить пример, где сейф можно отпереть/запереть, открыть/закрыть, ложить ключи и яблоко  как В сейф, так и НА него?

Неактивен

0    0    #13
06.02.2009 01:39

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

Re: Поверхности и контейнеры

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)

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru