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