diff --git a/main.lua b/main.lua index 6040302..68bad43 100644 --- a/main.lua +++ b/main.lua @@ -15,7 +15,8 @@ local Systems = Concord.systems local Entity = Concord.entity -local World = Concord.world +local World = Concord.world +local Worlds = Concord.worlds Component("test_comp_1", function(e, x, y) e.x = x @@ -58,12 +59,12 @@ function test_system:update2(dt) -- luacheck: ignore end -local world = World() +local world = World("testWorld") local entity = Entity() entity:give(Components.test_comp_1, 100, 100) -world:addEntity(entity) +Worlds.testWorld:addEntity(entity) world:addSystem(Systems.test_system, "update") world:addSystem(Systems.test_system, "update", "update2") diff --git a/src/assemblage.lua b/src/assemblage.lua index 79b3cbb..a6befed 100644 --- a/src/assemblage.lua +++ b/src/assemblage.lua @@ -1,14 +1,25 @@ --- Assemblage +local PATH = (...):gsub('%.[^%.]+$', '') + +local Assemblages = require(PATH..".world") + local Assemblage = {} Assemblage.__index = Assemblage -function Assemblage.new(assemble) +function Assemblage.new(name, assemble) + if (type(name) ~= "string") then + error("bad argument #1 to 'Assemblage.new' (string expected, got "..type(name)..")", 2) + end + local assemblage = setmetatable({ __assemble = assemble, + __name = name, __isAssemblage = true, }, Assemblage) + + Assemblages.register(name, assemblage) return assemblage end diff --git a/src/assemblages.lua b/src/assemblages.lua new file mode 100644 index 0000000..f86f629 --- /dev/null +++ b/src/assemblages.lua @@ -0,0 +1,29 @@ +-- Assemblages + +local PATH = (...):gsub('%.[^%.]+$', '') + +local Type = require(PATH..".type") + +local Assemblages = {} + +function Assemblages.register(name, assemblage) + if (type(name) ~= "string") then + error("bad argument #1 to 'Assemblages.register' (string expected, got "..type(name)..")", 3) + end + + if (not Type.isAssemblage(assemblage)) then + error("bad argument #2 to 'Assemblages.register' (assemblage expected, got "..type(world)..")", 3) + end + + if (rawget(Assemblages, name)) then + error("bad argument #2 to 'Assemblages.register' (Assemblage with name '"..name.."' is already registerd)", 3) + end + + Assemblages[name] = assemblage +end + +return setmetatable(Assemblages, { + __index = function(_, name) + error("Attempt to index assemblage '"..tostring(name).."' that does not exist / was not registered", 2) + end +}) \ No newline at end of file diff --git a/src/init.lua b/src/init.lua index 4eb9b99..5f32550 100644 --- a/src/init.lua +++ b/src/init.lua @@ -32,11 +32,17 @@ local Concord = { } Concord.entity = require(PATH..".entity") + Concord.component = require(PATH..".component") Concord.components = require(PATH..".components") + Concord.system = require(PATH..".system") Concord.systems = require(PATH..".systems") + Concord.world = require(PATH..".world") -Concord.assemblage = require(PATH..".assemblage") +Concord.worlds = require(PATH..".worlds") + +Concord.assemblage = require(PATH..".assemblage") +Concord.assemblages = require(PATH..".assemblages") return Concord diff --git a/src/world.lua b/src/world.lua index 86e76c3..217084e 100644 --- a/src/world.lua +++ b/src/world.lua @@ -2,7 +2,7 @@ local PATH = (...):gsub('%.[^%.]+$', '') -local Worlds = require(PATH..".world") +local Worlds = require(PATH..".worlds") local Type = require(PATH..".type") local List = require(PATH..".list") @@ -13,7 +13,7 @@ World.__index = World -- @return The new World function World.new(name) if (type(name) ~= "string") then - error("bad argument #1 to 'Component.new' (string expected, got "..type(name)..")", 2) + error("bad argument #1 to 'World.new' (string expected, got "..type(name)..")", 2) end local world = setmetatable({ @@ -31,7 +31,7 @@ function World.new(name) __isWorld = true, }, World) - Worlds.register(world) + Worlds.register(name, world) return world end diff --git a/src/worlds.lua b/src/worlds.lua index 0f8ad9c..2f8f5a8 100644 --- a/src/worlds.lua +++ b/src/worlds.lua @@ -19,7 +19,7 @@ function Worlds.register(name, world) error("bad argument #2 to 'Worlds.register' (World with name '"..name.."' is already registerd)", 3) end - Worlds[name] = component + Worlds[name] = world end return setmetatable(Worlds, {