Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
21.11.2007 23:43

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Сложное управление актером

Здравствуйте, господа!

Подскажите мне, пожалуйста, реализуема ли на TADS следующая команда:
"попросить Тимофея отвлечь продавца".

Глагол "попросить" сейчас определяется так
modify askVerb
    verb = 'попросить'
;


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

Неактивен

0    0    #2
24.11.2007 13:56

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Сложное управление актером

Большое спасибо за ответы.

Попробую реализовать преобразование фразы, как предложили GrAnd и uux.
Вариант с использованием стандартного синтаксиса "Тимофей, отвлеки продавца" сделаю только если не получится первый способ, потому что в моей игре нигде команды такого типа не используются, не хотелось бы быть непоследовательным.

Как реализую - напишу что получилось.

Неактивен

0    0    #3
24.11.2007 23:47

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Сложное управление актером

Итак, как все разрешилось.

Была написана функция preparseTell, которая преобразует строки из вида "попросить Тимофея отвлечь продавца" к виду "Тимофея, отвлечь продавца" (выглядит криво, но парсер всё понимает, спасибо GrAnd'у :-)

preparseTell: function(str)
{
  local lst, len, actor, rest, i, types, o;
 
  lst := parserTokenize(str);
  types := parserGetTokTypes(lst);
   
  len := length(lst);
   
  if (len >= 3)
  {
    o := parserDictLookup([] + lst[1], [PRSTYP_VERB]);
    if (length(o) = 0 || o[1] != askVerb)
      return str; 

    if ( (types[3] & PRSTYP_PREP) != 0 )
      return str;
     
    actor := lst[2];
    rest := '';
    for (i := 3; i <= len; i++)
      rest += lst[i] + ' ';
   
    return actor + ',' + rest;
  }
 
  return str;
}


Функция проверяет, является ли третье слово предлогом, чтобы отличать фразы
"попросить Тимофея отвлечь продавца" и
"попросить Тимофея о помощи".

Потенциальная засада возникает, если обращаться к актеру двумя словами, напр. "Иван Иванович" или имя+прилагательное, но у меня в игре нет ни того ни другого, поэтому данное решение можно считать условно безопасным.
Эта функция затем "вклинивается" в самый конец стандартной функции preparse в файле advr.t:

comStr := preparseTell(comStr);


Вроде бы работает.

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru