В игре понадобилось определить глагол. Сделал так (имена и явки поменял, но суть та же):
shootVerb : deepverb verb = 'стрелять' 'стрельни' 'стрелять из' 'стрельни из' sdesc = "стрельнуть" vopr = "Из чего " pred = fromPrep doAction = 'Shoot' ;
Так вот. pred походу вообще не влияет на "ответ по умолчанию". Есть объект "пистолет", например.
Пишу:
>стрелять из пистолета
Вы пальнули в воздух...
все нормально
Пишу>стрелять
(пистолет)
Вы пальнули в воздух...
И что за нахрен? Хочу, чтобы в скобочках было "из пистолета"...
Если preposition определен для "косвенного" объекта, то все путем. Если для "прямого" (в виде pred), то не ставит в нужный падеж и не добавляет предлог. У кого-нибудь есть мысли как сие исправить?
Я глянул, pred не используется нигде в библиотеке, кроме как в описаниях глаголов. Гранд, ты хотел сделать, но забыл что ли? Или я вообще не так все понял?
Неактивен
Как обычно, блин.
Кажется выяснил.
parseDefault определен в errorru.t... Но он не умеет обращаться с "моим" preposition (fromPrep).
В общем, надо поправить.
Неактивен
Короче, нашел спорное, но для меня вполне рабочее решение. Теперь, если у глагола определен parsdef
, то его pred
будет учитываться при построении фразы. Вот код функции ParseDefaultExt
(определенной в errorru.t):
parseDefaultExt: function(actor, verb, obj, prp) { "("; if (prp = nil) { if (verb.parsdef) { if (verb.pred) { verb.pred.sdesc; " "; } obj.(verb.parsdef); } else obj.vdesc; } else { 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"; }
Соответственно, мой глагол определен как:
shootVerb : deepverb verb = 'стрелять' 'стрельни' 'стрелять из' 'стрельни из' sdesc = "стрельнуть" vopr = "Из чего " pred = fromPrep parsdef = &rdesc doAction = 'Shoot' ;
Гранд, скажи свое веское слово.
Неактивен
Здесь parsdef не нужен, так как 1) склонение можно определить по предлогу, 2) он предназначен для случаев, когда предлога нет.
Изучив также все глаголы где используется pred, обнаружил, что практически в каждом случае в сообщение о результате автоподбора можно добавить этот предлог. Так что имеет смысл добавить флаг для исключений, а не для общего случая. Пока исключений не встретилось, но нужно хорошенько протестить, особенно для глаголов с различными функциональными предлогами.
/* Вытесняет 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"; }
Неактивен