Concord/fluid/instance.lua
2018-02-21 13:38:27 +01:00

68 lines
1.5 KiB
Lua

local PATH = (...):gsub('%.[^%.]+$', '')
local List = require(PATH..".list")
local EventManager = require(PATH..".eventManager")
local Instance = {}
Instance.__index = Instance
function Instance.new()
local instance = setmetatable({
entities = List(),
systems = List(),
systemCount = {},
eventManager = EventManager(),
}, Instance)
return instance
end
function Instance:addEntity(e)
e.instances:add(self)
self.entities:add(e)
self:checkEntity(e)
end
function Instance:checkEntity(e)
for i = 1, self.systems.size do
self.systems:get(i):__check(e)
end
end
function Instance:removeEntity(e)
e.instances:remove(self)
self.entities:remove(e)
for i = 1, self.systems.size do
self.systems:get(i):__remove(e)
end
end
function Instance:addSystem(system, eventName, callback)
self.systemCount[system] = (self.systemCount[system] or 0) + 1
self.systems:add(system)
self.eventManager:register(eventName, system, callback)
return self
end
function Instance:removeSystem(system, callback)
self.systemCount[system] = self.systemCount[system] - 1
if self.systemCount[system] == 0 then
self.systemCount[system] = nil
self.eventManager:deregister(eventName, system, callback)
end
return self
end
function Instance:emit(...)
self.eventManager:emit(...)
return self
end
return setmetatable(Instance, {
__call = function(_, ...) return Instance.new(...) end,
})