Казалось бы, тривиальнейшая задача — воспринимать введённое игроком имя объекта за команду «Осмотреть», вызванную на этот объект.
Однако, за 30 лет Информа (ок, 20, если говорить только об Inform 6) никто не удосужился такое реализовать в модуль.
Что ж, пришлось закатать рукава, проштудировать скудный IDM4, покубатурить с Ореолеком, сдуть пыль со своего английского на intfiction.org, убить три бесценных вечера, и всё же создать решение:
[ BeforeParsing o i j n flag; for (i=1 : i<=parse-->0 : i++) { ! перебираем все распознанные слова objectloop (o provides name) { ! перебираем все объекты, у которых есть name if (TestScope(o, player) && Refers(o, i)) { ! проверяем в фокусе ли объект и соотносится ли с ним проверяемое сейчас слово flag = 1; ! если объект в скоупе и слово — его, флаг равен 1 } } n = n + flag; ! увеличиваем счётчик, если флаг последнего слова сработал flag = 0; ! обнуляем флаг на следующий цикл } if (n < parse-->0) rfalse; ! если счётчик меньше, чем количество введённых слов — значит, не все они соотнеслись с объектами, возвращаем фейл, пусть парсер выдаёт ошибку for (j=buffer-->0 : j>0 : j--) { ! перебираем все вхождения в буфере buffer-->(j+2) = buffer-->j; ! смещаем вхождения в буфере на 2 вперёд } buffer-->1 = 'о'; ! в освободившееся первое вхождение в буфере пишем символ «о» (как «осмотреть») buffer-->2 = ' '; ! в освободившееся второе вхождение в буфере пишем символ пробела (после глагола) buffer-->0 = buffer-->0 + 2; ! увеличиваем длину буфера на 2 дополнительных символа VM_Tokenise(buffer, parse); ! репарсим буфер ];
Данная функция BeforeParsing вмешивается в привычный процесс распознавания того, что написал игрок, и быстренько проверяет, а не ввёл ли игрок имя какого-нибудь объекта, и если ввёл, то перед этим именем подставляет «о » и полученную команду подсовывает назад парсеру.
Тип функции — entry point, поэтому она должна быть объявлена после include "verblib" и до include "RussiaG".
Неактивен
Был ещё вот такой вариант:
Global examined_obj; [ UnknownVerb word x n; objectloop (x) { if (TestScope(x, player)){ if (Refers(x, 1)) { examined_obj = x; return 'ZZZ'; } }; }; rfalse; ]; [ ZZZSub; <<Examine examined_obj>>; ]; Verb "ZZZ" * -> ZZZ;
UnknownVerb — это тоже entry point функция, которая вступает в работу, если парсер не распознал слово на позиции глагола. В данном случае она смотрит на это слово, так же соотносит его с объектами и, если получается, вместо него возвращает глагол, уже в котором вызывается Examine.
Функционал такой же. Однако тут наступают проблемы с уточнениями, т. к. эта функция берёт первый попавшийся объект, прошедший проверку Refers().
Неактивен
Игра, на которой я тестил библиотеку: https://code.oreolek.ru/oreolek/inform6_examination
VM_Tokenise - это функция из русской библиотеки Inform, поэтому в английской версии рабочее решение нашли только через UnknownVerb. Если будет нужно на английском, придётся делать через стандартный Tokenise__.
Неактивен