Казалось бы, тривиальнейшая задача — воспринимать введённое игроком имя объекта за команду «Осмотреть», вызванную на этот объект.
Однако, за 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__.
Неактивен