Возвращаемые значения обработчиков
Если необходимо показать, что действие не выполнено (обработчик не сделал ничего полезного), возвращайте значение false. Например:
act = function(s)
if broken_leg then
return false
end
p [[Я ударил ногой по мячу.]]
endПри этом будет отображено описание по умолчанию, заданное с помощью обработчика 'game.act'. Обычно описание по умолчанию содержит описание невыполнимых действий. Что-то вроде:
game.act = 'Гм... Не получается...';
Итак, если вы не задали обработчик act или вернули из него false -- считается, что реакции нет и движок выполнит аналогичный обработчик у объекта 'game'.
Обычно, нет никакого смысла возвращать false из act, но существуют другие обработчики, о которых будет рассказано дальше, для которых описанное поведение точно такое же.
На самом деле, кроме 'game.act' и 'act' атрибутов объекта, существует обработчик 'onact' у объекта game, который может прервать выполнение обработчика 'act'.
Перед тем как вызвать обработчик 'act' у объекта, вызывается onact у game. Если обработчик вернёт false, выполнение 'act' обрывается. 'onact' удобно использовать, для контроля событий в комнате или игре, например:
-- вызываем onact комнат, если они есть
-- для действий на любой объект
game.onact = function(s, ...)
local r, v = std.call(here(), 'onact', ...)
if v == false then -- если false, обрубаем цепочку
return r, v
end
return
end
room {
nam = 'shop';
disp = 'Магазин';
onact = function(s, w)
p [[В магазине нельзя воровать!]]
p ([[Даже, если это всего лишь ]], w, '.')
return false
end;
obj = { 'мороженное', 'хлеб' };
}В данном примере, при попытке "потрогать" любой предмет, будет выведено сообщение о запрете данного действия.
Всё, что описано выше на примере 'act' действует и для других обработчиков: tak, inv, use, а также при переходах, о чём будет рассказано далее.
Иногда возникает необходимость вызвать функцию - обработчик вручную. Для этого используется синтаксис вызова метода объекта. 'Объект:метод(параметры)'. Например:
apple:act() -- вызовем обработчик 'act' у объекта 'apple' (если он
определён как функция!). _'яблоко':act() -- то же самое, но по
имени, а не по переменной-ссылке
Такой метод работает только в том случае, если вызываемый метод оформлен как функция. Вы можете воспользоваться 'std.call()' для вызова обработчика тем способом, каким это делает сам INSTEAD. (Будет описано в дальнейшем).