Казалось бы, тривиальнейшая задача — воспринимать введённое игроком имя объекта за команду «Осмотреть», вызванную на этот объект.
Однако, за 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".
Неактивен
Игра, на которой я тестил библиотеку: https://code.oreolek.ru/oreolek/inform6_examination
VM_Tokenise - это функция из русской библиотеки Inform, поэтому в английской версии рабочее решение нашли только через UnknownVerb. Если будет нужно на английском, придётся делать через стандартный Tokenise__.
Неактивен