Понадобилось получать нотификацию в случае, если некий hiddenItem будет найден (прибавить очков, например).
Не нашел существующих механизмов, в результате опять влез в advr.t
Теперь у наследников hiddenItem достаточно переопределить метод onFind и в нем прописать все необходимые действия - они выполнятся тогда, когда объект будет найден...
Новую версию библиотек качать здесь. На самом деле, туда включены все мои модификации:
parsdef (т.е. склонение, в котором используется подглагольный объект), то preposition, указанное в свойстве pred, будет использовано при построении "умолчальной" фразы при использовании объекта. Подробнее здесь.Надеюсь, все это кому-нибудь будет полезно...
Неактивен
Большое спасибо. Выложи, пожалуйста, изменения в виде отдельной библиотеки. Сообщения от первого лица не выделяй, я их уже включил в основную.
Неактивен
GrAndrey написал:
Выложи, пожалуйста, изменения в виде отдельной библиотеки. Сообщения от первого лица не выделяй, я их уже включил в основную.
Не понял. Как их выделить в отдельную библиотеку?
Я потому и правил advr.t, что не получилось доточить с помощью replace/modify...
Неактивен
fireton написал:
GrAndrey написал:
Выложи, пожалуйста, изменения в виде отдельной библиотеки. Сообщения от первого лица не выделяй, я их уже включил в основную.
Не понял. Как их выделить в отдельную библиотеку?
Я потому и правил advr.t, что не получилось доточить с помощью replace/modify...
Странно. Смотри пример замены функции в предыдущей теме.
По поводу первого лица - исправлены не все сообщения. Например, ищи verDoUnwear(actor). Тут чередование ш/с. Думаю, вместо кучки функций можно сделать одну, которой в качестве параметра передавать изменяемую букву.
Неактивен
По поводу первого лица - исправлены не все сообщения. Например, ищи verDoUnwear(actor). Тут чередование ш/с. Думаю, вместо кучки функций можно сделать одну, которой в качестве параметра передавать изменяемую букву.
Ты исправишь или мне сделать? Насчет одной функции - я думал сделать так, но потом прикинул, что запутаюсь нафик.
Квест от первого лица пока отложен, тот, что я готовлю на КРИЛ - "стандартно" от 2-го лица... Так что мне пока не к спеху.
Вот, подготовил файл-патч.
Он исправляет lockableDoorway, добавляет onFind для hiddenItem и исправляет parseDefaultExt.fireton_ext.t
/* Вытесняет parseDefault, но работает только в TADS >= 2.5.8 */
replace parseDefaultExt: function(actor, verb, obj, prp)
{
"(";
if (prp = nil && verb.pred = nil)
{
if (verb.parsdef) obj.(verb.parsdef);
else obj.vdesc;
}
else
{
if (prp = nil) prp:=verb.pred;
if (!(prp=toPrep && obj.isactor)) {prp.sdesc;" ";}
if (prp = atPrep or prp = inPrep) obj.vdesc;
if (prp = withPrep) obj.rdesc;
if (prp = overPrep) obj.tdesc;
if (prp = onPrep) obj.pdesc;
if (prp = offPrep or prp = fromPrep or prp = outPrep) obj.rdesc;
if (prp = toPrep) obj.ddesc;
}
")\n";
}
modify class hiddenItem
onFind = {}
;
modify class hider
searchObj(actor, list) =
{
local found, dest, i, tot;
/* see how much we get this time */
if (self.serialSearch)
{
found := [] + car(list);
list := cdr(list);
}
else
{
found := list;
list := nil;
}
/* set it(them) to the found item(s) */
if (length(found) = 1)
setit(found[1]); // only one item - set 'it'
else
setit(found); // multiple items - set 'them'
/* figure destination */
dest := actor;
if (not self.autoTake)
dest := dest.location;
/* note what we found, and move it to destination */
"<<ZAG(parserGetMe(),&sdesc)>> наш<<ella(actor)>> ";
tot := length(found);
i := 1;
while (i <= tot)
{
found[i].vdesc;
if (i+1 < tot)
", ";
else if (i = 1 and tot = 2)
" и ";
else if (i+1 = tot and tot > 2)
", и ";
found[i].onFind;
found[i].moveInto(dest);
i := i + 1;
}
/* say what happened */
if (self.autoTake)
{", и взял<<iao(actor)>> "; if (tot=1) found[1].itobjdesc; else "их"; ". ";}
else
"! ";
if (list<>nil and length(list)=0)
list := nil;
return list;
}
;
modify class doorway
verDoLockWith(actor, io) =
{
if (self.islocked)
{"<<ZAG(self,&itnomdesc)>> уже заперт"; yao(self); ". "; }
else if (not self.islockable)
{"<<ZAG(self,&itnomdesc)>> не может быть заперт"; yao(self); ". "; }
else if (self.mykey = nil)
"<<ZAG(actor,&ddesc)>> ничего не нужно, чтобы запереть <<self.itobjdesc>>. ";
else if (self.isopen)
"Сначала <<actor.ddesc>> придётся закрыть <<self.itobjdesc>>. ";
}
doLockWith(actor, io) =
{
if (io = self.mykey)
{
"Заперт"; yao(self);". ";
self.setIslocked(true);
}
else
"<<ZAG(io,&itnomdesc)>> не подход<<io.isThem ? "и" : "я">>т к замку. ";
}
;Отредактировано fireton (07.01.2008 21:56)
Неактивен