Delete unused ecs.lua toy
Add a quick type assertion to outRunner()
This commit is contained in:
parent
881ff0e734
commit
f07530623f
220
src/ecs.lua
220
src/ecs.lua
|
@ -1,220 +0,0 @@
|
||||||
ecs = {}
|
|
||||||
|
|
||||||
local allEntities <const> = {}
|
|
||||||
|
|
||||||
---@alias System { callback: fun(delta: number, entity: any, a: any, b: any, c: any, d: any, e: any, any), shapes: {}, keys: string[], entityCache: nil | table<any, boolean> }
|
|
||||||
|
|
||||||
---@type System[]
|
|
||||||
local systems <const> = {}
|
|
||||||
|
|
||||||
-- TODO: Add entity to any existing systems
|
|
||||||
function ecs.addEntity(entity)
|
|
||||||
allEntities[entity] = true
|
|
||||||
for _, system in pairs(systems) do
|
|
||||||
if entityMatchesShapes(entity, system.shapes) then
|
|
||||||
system.entityCache[entity] = true
|
|
||||||
else
|
|
||||||
system.entityCache[entity] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ecs.removeEntity(entity)
|
|
||||||
allEntities[entity] = nil
|
|
||||||
for _, system in pairs(systems) do
|
|
||||||
system.entityCache[entity] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local Placeholder = {}
|
|
||||||
---@generic T
|
|
||||||
---@return T
|
|
||||||
function ecs.field()
|
|
||||||
return Placeholder
|
|
||||||
end
|
|
||||||
|
|
||||||
function allKeysIncluded(entity, filter)
|
|
||||||
for k, _ in pairs(filter) do
|
|
||||||
if not entity[k] then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function entityMatchesShapes(entity, shapes)
|
|
||||||
for _, shape in pairs(shapes) do
|
|
||||||
if not allKeysIncluded(entity, shape) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
---@generic T
|
|
||||||
---@generic U
|
|
||||||
---@generic V
|
|
||||||
---@generic W
|
|
||||||
---@param tShape T
|
|
||||||
---@param uShape U?
|
|
||||||
---@param vShape V?
|
|
||||||
---@param wShape W?
|
|
||||||
---@return fun(callback: fun(componentT: T, componentU: U, componentV: V, componentW: W))
|
|
||||||
function ecs.entitiesHavingShapes(tShape, uShape, vShape, wShape)
|
|
||||||
return function() end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Print contents of `tbl`, with indentation.
|
|
||||||
-- `indent` sets the initial level of indentation.
|
|
||||||
function tprint(tbl, indent)
|
|
||||||
if not indent then
|
|
||||||
indent = 0
|
|
||||||
end
|
|
||||||
for k, v in pairs(tbl) do
|
|
||||||
formatting = string.rep(" ", indent) .. k .. ": "
|
|
||||||
if type(v) == "table" then
|
|
||||||
print(formatting)
|
|
||||||
tprint(v, indent + 1)
|
|
||||||
elseif type(v) == "boolean" then
|
|
||||||
print(formatting .. tostring(v))
|
|
||||||
else
|
|
||||||
print(formatting .. v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function addSystem(callback, keys, shapes)
|
|
||||||
systems[#systems + 1] = {
|
|
||||||
callback = callback,
|
|
||||||
keys = keys,
|
|
||||||
shapes = shapes,
|
|
||||||
entityCache = nil,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
---@return boolean
|
|
||||||
function is(entity, shape)
|
|
||||||
return allKeysIncluded(entity, shape)
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param deltaSeconds number
|
|
||||||
function ecs.update(deltaSeconds)
|
|
||||||
for _, system in pairs(systems) do
|
|
||||||
if not system.entityCache then
|
|
||||||
system.entityCache = {}
|
|
||||||
for entity, _ in pairs(allEntities) do
|
|
||||||
if entityMatchesShapes(entity, system.shapes) then
|
|
||||||
system.entityCache[entity] = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local keys = system.keys
|
|
||||||
for entity, _ in pairs(system.entityCache) do
|
|
||||||
system.callback(
|
|
||||||
deltaSeconds,
|
|
||||||
entity,
|
|
||||||
entity[keys[1]],
|
|
||||||
entity[keys[2]],
|
|
||||||
entity[keys[3]],
|
|
||||||
entity[keys[4]],
|
|
||||||
entity
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Returns a function that accepts a callback. This callback will receive one argument for each Shape provided.
|
|
||||||
---
|
|
||||||
---@generic T
|
|
||||||
---@generic TKey
|
|
||||||
---@generic U
|
|
||||||
---@generic UKey
|
|
||||||
---@generic V
|
|
||||||
---@generic VKey
|
|
||||||
---@generic W
|
|
||||||
---@generic WKey
|
|
||||||
---@param tShape { [TKey]: T }
|
|
||||||
---@param uShape { [UKey]: U } | fun(entity: any, componentT: T, any) | nil
|
|
||||||
---@param vShape { [VKey]: V } | fun(entity: any, componentT: T, componentU: U, any) | nil
|
|
||||||
---@param wShape { [WKey]: W } | fun(entity: any, componentT: T, componentU: U, componentV: V, any) | nil
|
|
||||||
---@param finalFunc fun(entity: any, componentT: T, componentU: U, componentV: V, componentW: W, any) | nil
|
|
||||||
function ecs.forEntitiesWith(tShape, uShape, vShape, wShape, finalFunc)
|
|
||||||
local maybeShapes = { tShape, uShape, vShape, wShape, finalFunc }
|
|
||||||
local shapes = {}
|
|
||||||
local callback
|
|
||||||
|
|
||||||
for _, maybeShape in pairs(maybeShapes) do
|
|
||||||
if type(maybeShape) == "table" then
|
|
||||||
shapes[#shapes + 1] = maybeShape
|
|
||||||
elseif type(maybeShape) == "function" then
|
|
||||||
callback = maybeShape
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local keys = {}
|
|
||||||
for _, shape in pairs(shapes) do
|
|
||||||
for key, _ in pairs(shape) do
|
|
||||||
keys[#keys + 1] = key
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
addSystem(callback, keys, shapes)
|
|
||||||
end
|
|
||||||
|
|
||||||
local f = ecs.field()
|
|
||||||
local XYPair = { x = f, y = f }
|
|
||||||
local Position = { position = XYPair }
|
|
||||||
local Target = { target = XYPair }
|
|
||||||
local Velocity = { velocity = XYPair }
|
|
||||||
|
|
||||||
function ecs.overlayOnto(entity, value)
|
|
||||||
for key, v in pairs(value) do
|
|
||||||
entity[key] = v
|
|
||||||
end
|
|
||||||
ecs.addEntity(entity)
|
|
||||||
end
|
|
||||||
|
|
||||||
local data = {
|
|
||||||
position = { x = 0, y = 0 },
|
|
||||||
velocity = { x = 1, y = 2 },
|
|
||||||
}
|
|
||||||
|
|
||||||
---@generic T
|
|
||||||
---@param shape T
|
|
||||||
---@param entity unknown
|
|
||||||
---@return T
|
|
||||||
function ecs.get(shape, entity)
|
|
||||||
return entity
|
|
||||||
end
|
|
||||||
|
|
||||||
---@generic T
|
|
||||||
---@param entity unknown
|
|
||||||
---@param shape `T`
|
|
||||||
---@param value `T`
|
|
||||||
function ecs.set(entity, shape, value)
|
|
||||||
for key, v in pairs(shape) do
|
|
||||||
entity[key] = value[v]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
ecs.addEntity(data)
|
|
||||||
|
|
||||||
ecs.forEntitiesWith(Position, Velocity, function(delta, e, pos, vel)
|
|
||||||
pos.x = pos.x + (delta * vel.x)
|
|
||||||
pos.y = pos.y + (delta * vel.y)
|
|
||||||
print("position")
|
|
||||||
tprint(pos, 1)
|
|
||||||
ecs.set(Target, e, {
|
|
||||||
--target = { x = 10, y = 10}
|
|
||||||
})
|
|
||||||
end)
|
|
||||||
|
|
||||||
ecs.forEntitiesWith(Target, function(delta, e, pos, vel)
|
|
||||||
pos.x = pos.x + (delta * vel.x)
|
|
||||||
pos.y = pos.y + (delta * vel.y)
|
|
||||||
print("position")
|
|
||||||
tprint(pos, 1)
|
|
||||||
ecs.set(e, Target, "hallo")
|
|
||||||
end)
|
|
||||||
|
|
||||||
ecs.update(1)
|
|
|
@ -413,6 +413,9 @@ function outRunner(runner, message)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if type(runner) ~= "number" then
|
||||||
|
error("Expected runner to have type 'number', but was: " .. type(runner))
|
||||||
|
end
|
||||||
outRunners[#outRunners + 1] = runners[runner]
|
outRunners[#outRunners + 1] = runners[runner]
|
||||||
table.remove(runners, runner)
|
table.remove(runners, runner)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue