В примере из демонстрационной игры (http://rtads.org/man/TADSSMPL.HTM), следующая штука выходит:
Чтобы взять череп с пьедестала, нужно предварительно положить на него камень, тогда не сработает ловушка... но, если забрать только что положенный камень, ловушка так же не сработает:), ведь, по логике самого метода, при отсутствии на пьедестале объекта, вышеназванного бага, не должно быть... Сам метод:
doTake(actor) = { if (self.location <> pedestal or smallRock.location = pedestal) { pass doTake; } else { "Едва ты успеваешь поднять череп, как из стен вылетает целая туча отравленных стрел! Ты пытаешься увернуться от них, но их слишком много!"; die(); } }
Отредактировано Kephra (09.04.2011 19:52)
Неактивен
kepra, не читал всю переписку, но хочу немного поделиться по поводу крайнего вопроса. TADS далеко не СИ, хотя синтаксис похож. Обработчик глагола (doAction) и верификатор (verDoAction) проверяются системой, если в системе определён соответсвующий глагол (надо почитать главу "Создание новых команд" http://rtads.org/man/TADSADV.HTM#usingpredef). Посмотрим на глагол take, в advr.t есть определение:
takeVerb: deepverb ... doAction = 'Take'
Это значит, что во всех объектах сцены будет сначала проверяться прямой верификатор, со строгим синтаксисом -
verDoTake(actor) и если он не выдаёт строки, то будет срабатывать метод doTake(actor).
Аргумент actor подставляет сама система. Например, ты вводишь команду "взять череп", тогда подставляется вместо actor объект главного героя Me. Если написать "пьедестал, возьми череп", то тогда (если бы он был живым и разрешалось командовать), вместо actor подставился бы этот объект.
Все это к чему, надо понимать глагол какого типа используется и какой синтаксис верификаторов и реакций применять, иначе движок может отвалиться или проигнорирует объявление метода.
Неактивен