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