Skip to content

Класс объектов

Конструкторы объектов широко использовались в STEAD2. В STEAD3 obj/dlg/room реализованы как классы объектов. Класс объектов удобно создавать для тех случаев, когда поведение создаваемого объекта не укладывается в стандартные объекты obj/room/dlg и вы хотите поменять методы класса. Изменив метод класса, например, вы можете вообще изменить то, как выглядит предмет в сцене. В качестве примера, рассмотрим создание класса "контейнер". Контейнер может хранить в себе другие объекты, быть закрытым и открытым.

lua
-- создаём собственный класс контейнера
cont = std.class({ -- создаём класс cont
	__cont_type = true; -- для определения типа объекта
	display = function(s) -- переопределяем метод показа предмета
		local d = std.obj.display(s)
		if s:closed() or #s.obj == 0 then
			return d
		end
		local c = s.cont or 'Внутри: ' -- описатель содержимого
		local empty = true
		for i = 1, #s.obj do
			local o = s.obj[i]
			if o:visible() then
				empty = false
				if i > 1 then c = c .. ', ' end
				c = c..'{'..std.nameof(o)..'|'..std.dispof(o)..'}'
			end
		end
		if empty then
			return d
		end
		c = c .. '.'
		return std.par(std.space_delim, d, c)
	end;
}, std.obj) -- мы наследуемся от стандартного объекта

После этого, вы можете создавать контейнеры так:

lua
cont {
	nam = 'ящик';
	dsc = [[Тут есть {ящик}.]];
	cont = 'В ящике: ';
}: with {
	'яблоко', 'груша';
}

Когда контейнер будет открыт, вы увидите описание ящика, а также содержимое ящика в виде строки ссылок: 'В ящике: яблоко, груша.' dsc объектов яблоко и груша будут тоже показаны, если они заданы.

Если необходимо прятать dsc объектов при открытии контейнера, оставляя лишь имена объектов, то можно выполнить следующую модификацию:

lua
-- заменим функцию показа любого объекта
-- если объект внутри контейнера, не вызывать его dsc
std.obj.display = function(self)
	local w = self:where() -- где объект?
	if not std.is_obj(w, 'cont') then -- если не в контейнере
		local d = std.call(self, 'dsc')
		return d
	end
end

К сожалению, подробное описание классов выходит за рамки данного руководства, эти вещи будут описаны в другом руководстве для разработчиков модулей. А пока, для вашей первой игры, вам не стоит писать свои классы объектов.