Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
07.01.2008 16:48

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

Тон

Нотификатор нахождения скрытых объектов

Понадобилось получать нотификацию в случае, если некий hiddenItem будет найден (прибавить очков, например).
Не нашел существующих механизмов, в результате опять влез в advr.t

Теперь у наследников hiddenItem достаточно переопределить метод onFind и в нем прописать все необходимые действия - они выполнятся тогда, когда объект будет найден...

Новую версию библиотек качать здесь. На самом деле, туда включены все мои модификации:

  1. Возможность вести повествование от первого лица.
  2. Исправлены ошибки в lockableDoorway
  3. если у глагола определен parsdef (т.е. склонение, в котором используется подглагольный объект), то preposition, указанное в свойстве pred, будет использовано при построении "умолчальной" фразы при использовании объекта. Подробнее здесь.
  4. onFind в наследниках hiddenItem

Надеюсь, все это кому-нибудь будет полезно...

Неактивен

0    0    #2
07.01.2008 19:11

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

меньше слов

Re: Нотификатор нахождения скрытых объектов

Большое спасибо. Выложи, пожалуйста, изменения в виде отдельной библиотеки. Сообщения от первого лица не выделяй, я их уже включил в основную.

Неактивен

0    0    #3
07.01.2008 19:31

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

Тон

Re: Нотификатор нахождения скрытых объектов

GrAndrey написал:

Выложи, пожалуйста, изменения в виде отдельной библиотеки. Сообщения от первого лица не выделяй, я их уже включил в основную.

Не понял. Как их выделить в отдельную библиотеку?
Я потому и правил advr.t, что не получилось доточить с помощью replace/modify...

Неактивен

0    0    #4
07.01.2008 20:11

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

меньше слов

Re: Нотификатор нахождения скрытых объектов

fireton написал:

GrAndrey написал:

Выложи, пожалуйста, изменения в виде отдельной библиотеки. Сообщения от первого лица не выделяй, я их уже включил в основную.

Не понял. Как их выделить в отдельную библиотеку?
Я потому и правил advr.t, что не получилось доточить с помощью replace/modify...

Странно. Смотри пример замены функции в предыдущей теме.

По поводу первого лица - исправлены не все сообщения. Например, ищи verDoUnwear(actor). Тут чередование ш/с. Думаю, вместо кучки функций можно сделать одну, которой в качестве параметра передавать изменяемую букву.

Неактивен

0    0    #5
07.01.2008 21:55

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

Тон

Re: Нотификатор нахождения скрытых объектов

По поводу первого лица - исправлены не все сообщения. Например, ищи verDoUnwear(actor). Тут чередование ш/с. Думаю, вместо кучки функций можно сделать одну, которой в качестве параметра передавать изменяемую букву.

Ты исправишь или мне сделать? Насчет одной функции - я думал сделать так, но потом прикинул, что запутаюсь нафик. wink Квест от первого лица пока отложен, тот, что я готовлю на КРИЛ - "стандартно" от 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)

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru