From dfe5d10a38b100b040a68215028aff8233cd24d3 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Wed, 18 Dec 2024 17:38:39 +0700 Subject: [PATCH] default/construct predef fragments --- develop/untests.lua | 75 +++++++++++++++++++++++++++++++++++++++++++++ evolved.lua | 49 +++++++++++++++++++++++++++-- 2 files changed, 121 insertions(+), 3 deletions(-) diff --git a/develop/untests.lua b/develop/untests.lua index b986e22..0e55429 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -273,3 +273,78 @@ do assert(evo.get(e2, f1) == 42 and evo.get(e2, f2) == 44) end end + +do + local f1, f2, f3, f4 = evo.id(), evo.id(), evo.id(), evo.id() + evo.set(f1, evo.DEFAULT, 42) + evo.set(f2, evo.DEFAULT, false) + + local e = evo.id() + + evo.set(e, f1) + evo.set(e, f2) + evo.set(e, f3) + evo.set(e, f4, false) + + assert(evo.get(e, f1) == 42) + assert(evo.get(e, f2) == false) + assert(evo.get(e, f3) == true) + assert(evo.get(e, f4) == false) +end + +do + local f1, f2, f3, f4, f5 = evo.id(), evo.id(), evo.id(), evo.id(), evo.id() + evo.set(f1, evo.CONSTRUCT, function(_, a, b) return a - b end) + evo.set(f2, evo.CONSTRUCT, function(_, c) return c end) + evo.set(f3, evo.CONSTRUCT, function() return nil end) + evo.set(f4, evo.CONSTRUCT, function() return false end) + evo.set(f5, evo.CONSTRUCT, function(e) return e end) + + local e = evo.id() + + evo.insert(e, f1, 43, 1) + evo.insert(e, f2, false) + evo.insert(e, f3, 43) + evo.insert(e, f4, 43) + evo.insert(e, f5) + + assert(evo.get(e, f1) == 42) + assert(evo.get(e, f2) == false) + assert(evo.get(e, f3) == true) + assert(evo.get(e, f4) == false) + assert(evo.get(e, f5) == e) + + evo.assign(e, f1, 42, 2) + evo.assign(e, f2, true) + evo.assign(e, f3, 43) + evo.assign(e, f4, 43) + evo.assign(e, f5, 43) + + assert(evo.get(e, f1) == 40) + assert(evo.get(e, f2) == true) + assert(evo.get(e, f3) == true) + assert(evo.get(e, f4) == false) + assert(evo.get(e, f5) == e) +end + +do + local f1, f2 = evo.id(), evo.id() + evo.set(f1, evo.DEFAULT, 42) + evo.set(f1, evo.CONSTRUCT, function() return nil end) + evo.set(f2, evo.DEFAULT, 42) + evo.set(f2, evo.CONSTRUCT, function() return false end) + + local e = evo.id() + + evo.set(e, f1, 43) + evo.set(e, f2, 43) + + assert(evo.get(e, f1) == 42) + assert(evo.get(e, f2) == false) + + evo.set(e, f1, 43) + evo.set(e, f2, 43) + + assert(evo.get(e, f1) == 42) + assert(evo.get(e, f2) == false) +end diff --git a/evolved.lua b/evolved.lua index c3e3fb4..80e19f2 100644 --- a/evolved.lua +++ b/evolved.lua @@ -116,6 +116,40 @@ end --- --- +evolved.DEFAULT = __acquire_id() +evolved.CONSTRUCT = __acquire_id() + +--- +--- +--- +--- +--- + +---@param entity evolved.entity +---@param fragment evolved.fragment +---@param component evolved.component +---@param ... any construct additional parameters +---@return evolved.component +local function __construct(entity, fragment, component, ...) + local construct = evolved.get(fragment, evolved.CONSTRUCT) + + if construct ~= nil then + component = construct(entity, component, ...) + end + + if component == nil then + component = evolved.get(fragment, evolved.DEFAULT) + end + + return component == nil and true or component +end + +--- +--- +--- +--- +--- + ---@param fragment evolved.fragment ---@return evolved.chunk ---@nodiscard @@ -515,7 +549,10 @@ end ---@param entity evolved.entity ---@param fragment evolved.fragment ---@param component evolved.component -function evolved.set(entity, fragment, component) +---@param ... any construct additional parameters +function evolved.set(entity, fragment, component, ...) + component = __construct(entity, fragment, component, ...) + if not __alive_id(entity) then return false end @@ -582,8 +619,11 @@ end ---@param entity evolved.entity ---@param fragment evolved.fragment ---@param component evolved.component +---@param ... any construct additional parameters ---@return boolean is_assigned -function evolved.assign(entity, fragment, component) +function evolved.assign(entity, fragment, component, ...) + component = __construct(entity, fragment, component, ...) + if not __alive_id(entity) then return false end @@ -611,8 +651,11 @@ end ---@param entity evolved.entity ---@param fragment evolved.fragment ---@param component evolved.component +---@param ... any construct additional parameters ---@return boolean is_inserted -function evolved.insert(entity, fragment, component) +function evolved.insert(entity, fragment, component, ...) + component = __construct(entity, fragment, component, ...) + if not __alive_id(entity) then return false end