local ffi = require("ffi") local class, object = require("class"), require("class.object") local fficlass = require("class.fficlass") local LuaComponent = require("ecs.LuaComponent") require("ecs") local ECS = class(object) ECS.N_ENTITIES = 100 function ECS:init() self.entities = ffi.new("entity_t[?]", ECS.N_ENTITIES) -- Making sure that everything is set for i=0,ECS.N_ENTITIES-1 do self.entities[i] = false end self.components = {} self.components_classes = {} self.n_components = 0 end function ECS:create_ffi_component(name, structdef) assert(not self.components_classes[name]) local new_component = fficlass("bool _alive;"..structdef) self.components_classes[name] = new_component self.components[name] = new_component:new_array(ECS.N_ENTITIES) self.n_components = self.n_components + 1 return new_component end function ECS:create_lua_component(name, ...) assert(not self.components_classes[name]) local new_component = class(... or LuaComponent) self.components_classes[name] = new_component self.components[name] = {} for i=0,ECS.N_ENTITIES-1 do self.components[name][i] = self.components_classes[name]:new() end self.n_components = self.n_components + 1 return new_component end function ECS:get_component(name, id) return self.components[name][id] end return ECS