Concord/fluid/entity.lua
Josh Perry de35fdc450 Fixed removed list not being cleared
After an entity has a component removed from it, the apply function wasn't removing it from the removed list.
This had weird side-effects like the inability to readd components after they were removed.

For example:

    entity:give(Foo):apply()
    entity:remove(Foo):apply()
    entity:give(Foo):apply() -- This line would fail to add the Foo component again.
2018-03-13 17:44:05 +00:00

80 lines
1.8 KiB
Lua

local PATH = (...):gsub('%.[^%.]+$', '')
local List = require(PATH..".list")
local Entity = {}
Entity.__index = Entity
--- Creates and initializes a new Entity.
-- @return A new Entity
function Entity.new()
local e = setmetatable({
components = {},
removed = {},
instances = List(),
}, Entity)
return e
end
--- Gives an Entity a component with values.
-- @param component The Component to add
-- @param ... The values passed to the Component
-- @return self
function Entity:give(component, ...)
self.components[component] = component:__initialize(...)
return self
end
--- Removes a component from an Entity.
-- @param component The Component to remove
-- @return self
function Entity:remove(component)
self.removed[component] = true
return self
end
--- Checks the Entity against the pools again.
-- @return self
function Entity:apply()
for i = 1, self.instances.size do
self.instances:get(i):checkEntity(self)
end
for component, _ in pairs(self.removed) do
self.components[component] = nil
self.removed[component] = nil
end
return self
end
--- Destroys the Entity.
-- @return self
function Entity:destroy()
for i = 1, self.instances.size do
self.instances:get(i):removeEntity(self)
end
return self
end
--- Gets a Component from the Entity.
-- @param component The Component to get
-- @return The Bag from the Component
function Entity:get(component)
return self.components[component]
end
--- Returns true if the Entity has the Component.
-- @params component The Component to check against
-- @return True if the entity has the Bag. False otherwise
function Entity:has(component)
return self.components[component] ~= nil
end
return setmetatable(Entity, {
__call = function(_, ...) return Entity.new(...) end,
})