Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

3    0    #1
15.08.2019 20:54

Cheshire
Участник (+127, -23)
Зарегистрирован: 01.07.2009
Сообщений: 331
Вебсайт

«Ловко орудуя топором, вы разрубили все ваши монеты пополам. Теперь у вас в два раза больше золота».
Морыч

Имя объекта как аналог команды «Осмотреть…» этот объект

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

Неактивен

0    0    #2
15.08.2019 22:13

Re: Имя объекта как аналог команды «Осмотреть…» этот объект

А нельзя вместо "о [распарсенное слово]" использовать что-то более общее, типа <<examine [распарсенное слово]>>?

Неактивен

0    0    #3
16.08.2019 07:06

Cheshire
Участник (+127, -23)
Зарегистрирован: 01.07.2009
Сообщений: 331
Вебсайт

«Ловко орудуя топором, вы разрубили все ваши монеты пополам. Теперь у вас в два раза больше золота».
Морыч

Re: Имя объекта как аналог команды «Осмотреть…» этот объект

Был ещё вот такой вариант:

Код:

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().

Неактивен

0    0    #4
16.08.2019 07:16

Oreolek
Модератор (+412, -165)
Откуда: Кемерово
Зарегистрирован: 02.11.2009
Сообщений: 616
Вебсайт

Re: Имя объекта как аналог команды «Осмотреть…» этот объект

Игра, на которой я тестил библиотеку: https://code.oreolek.ru/oreolek/inform6_examination

VM_Tokenise - это функция из русской библиотеки Inform, поэтому в английской версии рабочее решение нашли только через UnknownVerb. Если будет нужно на английском, придётся делать через стандартный Tokenise__.

Неактивен

Powered by PunBB
© copyright 2001–2019 iFiction.Ru