Понадобилось получать нотификацию в случае, если некий 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)
Неактивен