Действие объектов друг на друга
Игрок может действовать объектом инвентаря на другие объекты. Для этого он щелкает мышью на предмет инвентаря, а затем, на предмет сцены. При этом вызывается обработчик 'used' у объекта, на который действуют, и обработчик 'use' объекта, которым действуют.
Например:
obj {
nam = 'нож';
dsc = 'На столе лежит {нож}';
inv = 'Острый!';
tak = 'Я взял нож!';
use = 'Вы пытаетесь использовать нож.';
};
obj {
nam = 'стол';
dsc = 'В комнате стоит {стол}.';
act = 'Гм... Просто стол...';
obj = { 'нож' };
used = function(s)
p 'Вы пытаетесь сделать что-то со столом...';
return false
end;
};В данном примере, обработчик used возвращает false. Зачем? Если вы помните, возврат false означает, что обработчик сообщает движку о том, что событие он не обработал. Если бы мы не вернули бы false, очередь до обработчика 'use' объекта 'нож' просто бы не дошла. На самом деле, в реальности обычно вы будете пользоваться или use или used, вряд ли имеет смысл выполнять оба обработчика во время действия предмета на предмет.
Ещё один пример, когда удобно вернуть false:
use = function(s, w)
if w^'яблоко' then
p [[Я почистил яблоко.]]
w.cut = true
return
end
return false;
endВ данном случае use у яблока обрабатывает только одну ситуацию -- действие на яблоко. В остальных случаях, обработчик возвращает false и движок вызовет метод по умолчанию: game.use.
Но лучше, если вы пропишете действие по умолчанию для ножа:
use = function(s, w)
if w^'яблоко' then
p [[Я почистил яблоко.]]
w.cut = true
return
end
p [[Не стоит размахивать ножом!]]
endЭтот пример также демонстрирует тот факт, что вторым параметром у use является предмет, на который мы действуем. У метода 'used', соответственно, второй параметр -- это объект, который действует на нас:
obj {
nam = 'мусорка';
dsc = [[В углу стоит {мусорка}.]];
used = function(s, w)
if w^'яблоко' then
p [[Я выбросил яблоко в мусорку.]]
remove(w)
return
end
return false;
end
}Как вы помните, перед вызовом use вызывается обработчик onuse у объекта game, потом у объекта 'игрок', а потом у текущей комнаты. Вы можете блокировать 'use', вернув из любого из перечисленных методов 'onuse' -- false.
Использовать 'use' или 'used' (или оба) это вопрос личных предпочтений, однако, метод used вызывается раньше и, следовательно, имеет больший приоритет.