Здравствуйте, господа!
Подскажите мне, пожалуйста, реализуема ли на TADS следующая команда:
"попросить Тимофея отвлечь продавца".
Глагол "попросить" сейчас определяется такmodify askVerb
verb = 'попросить'
;
Заранее спасибо.
Неактивен
Большое спасибо за ответы.
Попробую реализовать преобразование фразы, как предложили GrAnd и uux.
Вариант с использованием стандартного синтаксиса "Тимофей, отвлеки продавца" сделаю только если не получится первый способ, потому что в моей игре нигде команды такого типа не используются, не хотелось бы быть непоследовательным.
Как реализую - напишу что получилось.
Неактивен
Итак, как все разрешилось.
Была написана функция 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);
Вроде бы работает.
Неактивен