Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
14.03.2009 21:04

Natalka
Участник
Зарегистрирован: 01.03.2009
Сообщений: 8

Объект, создаваемый из частей

Еще раз здравствуйте.

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

Единственная идея, пришедшая мне в голову:
сделать части поверхностями, чтобы была возможность накладывать их друг на друга, а для проверки правильности сборки проверить что на что наложено.

Но при таком наложении у меня в инвентаре части  и создаваемый объект все равно отображаются отдельно.
Код и вовсе странный получается:

Код:

buterbrod : fooditem, container
    sdesc = "бутерброд"
    rdesc = "бутерброда"
    ddesc = "бутерброду"
    vdesc = "бутерброд"
    tdesc = "бутербродом"
    pdesc = "бутерброде"
    noun = 'бутерброд' 'бутерброда' 'бутерброду' 'бутербродом' 'бутерброде' 'бутерброду#d' 'бутербродом#t'
    ldesc = "Бутерброд"
    isHim = true
;

syr: fooditem, surface
    sdesc = "сыр"
   rdesc = "сыра"
   ddesc = "сыру"
    vdesc = "сыр"
    tdesc = "сыром"
    pdesc = "сыре"
    noun = 'сыр' 'сыра' 'сыру' 'сыром' 'сыре' 'сыру#d' 'сыром#t'
ldesc= "Это сыр."    
isHim = true
   
doPutOn(actor, io) =
    {
        self.moveInto(io);
    bulochka.moveInto(buterbrod);
    buterbrod.moveInto(Me);
    "Вы положили сыр "; io.vdesc; ". ";
    
    } 
;

bulochka: fooditem, qsurface
    sdesc = "булочка"
    rdesc = "булочки"
    ddesc = "булочке"
    vdesc = "булочку"
    tdesc = "булочкой"
    pdesc = "булочке"
    noun = 'булочка' 'булочки' 'булочке' 'булочку' 'булочкой' 'булочке#d' 'булочкой#t' 'булка' 'булки' 'булке' 'булку' 'булкой' 'булке#d' 'булкой#t'
    ldesc =  "Это булочка. "


isHer=true
;

Как этого можно избежать?

И может быть существует какой-то более правильный и простой способ конструирования нового объекта?

Заранее спасибо.

Отредактировано Natalka (14.03.2009 21:27)

Неактивен

0    0    #2
14.03.2009 22:11

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

Re: Объект, создаваемый из частей

Natalka написал:

Еще раз здравствуйте.

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

Единственная идея, пришедшая мне в голову:
сделать части поверхностями, чтобы была возможность накладывать их друг на друга, а для проверки правильности сборки проверить что на что наложено.

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

[SNIP]

Как этого можно избежать?

И может быть существует какой-то более правильный и простой способ конструирования нового объекта?

Заранее спасибо.

Возможно два подхода: один - если после объединения в бутерброд к сыру и булочке не требуется обращаться по отдельности. Тогда сыр и булочку перемещаем в nil (moveInto(nil)), а для результирующего объекта-бутерброда надо еще продублировать лексические свойства сыра и булочки. Кроме того, для него делается команда "разобрать бутерброд" (ну, или аналог какой-нибудь - с одним объектом), по которой уже бутерброд будет перемещаться в локацию nil, а сыр и булочка - возвращаться в инвентарь.

Если же нам и после объединения в бутерброд надо обращаться к булочке и сыру по отдельности, то Ваш подход в целом правильный. Чтобы сыр и булочка "не отсвечивали", надо присвоить их свойству isListed, "отвечающему" за отображение предметов во всевозможных списках, значение nil:

Код:

syr: fooditem, surface
    sdesc = "сыр"
   rdesc = "сыра"
   ddesc = "сыру"
    vdesc = "сыр"
    tdesc = "сыром"
    pdesc = "сыре"
    noun = 'сыр' 'сыра' 'сыру' 'сыром' 'сыре' 'сыру#d' 'сыром#t'
ldesc= "Это сыр."    
isHim = true
   
doPutOn(actor, io) =
    {if(io=bulochka)
        {self.moveInto(buterbrod);
          bulochka.moveInto(buterbrod);
          bulochka.isListed:=nil;
          self.isListed:=nil;
          buterbrod.moveInto(Me);
          "Вы положили сыр "; io.vdesc; ". ";
        }
    else
      {"Класть сыр на этот предмет нет смысла.";
      }
   } 
;

Чтобы не переключать isListed туда-сюда каждый раз (это задалбывает, если вариантов объединения сыра и булочки много), можно просто определить для этих двух объектов isListed следующим образом:

Код:

isListed={if(self.location=buterbrod) 
                 {return nil;}  // Если предмет находится в бутерброде, то он - его составная часть и не должен отображаться
               else
                 {return true;}  // Во всех остальных случаях отображаем предмет обычным образом
             }

Отредактировано uux (14.03.2009 22:14)

Неактивен

0    0    #3
17.03.2009 17:01

Natalka
Участник
Зарегистрирован: 01.03.2009
Сообщений: 8

Re: Объект, создаваемый из частей

Спасибо, "бутерброд" теперь получился.

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru