Skip to content

Действие объектов друг на друга

Игрок может действовать объектом инвентаря на другие объекты. Для этого он щелкает мышью на предмет инвентаря, а затем, на предмет сцены. При этом вызывается обработчик 'used' у объекта, на который действуют, и обработчик 'use' объекта, которым действуют.

Например:

lua
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:

lua
use = function(s, w)
	if w^'яблоко' then
		p [[Я почистил яблоко.]]
		w.cut = true
		return
	end
	return false;
end

В данном случае use у яблока обрабатывает только одну ситуацию -- действие на яблоко. В остальных случаях, обработчик возвращает false и движок вызовет метод по умолчанию: game.use.

Но лучше, если вы пропишете действие по умолчанию для ножа:

lua
use = function(s, w)
	if w^'яблоко' then
		p [[Я почистил яблоко.]]
		w.cut = true
		return
	end
	p [[Не стоит размахивать ножом!]]
end

Этот пример также демонстрирует тот факт, что вторым параметром у use является предмет, на который мы действуем. У метода 'used', соответственно, второй параметр -- это объект, который действует на нас:

lua
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 вызывается раньше и, следовательно, имеет больший приоритет.