diff --git a/README.md b/README.md index 2a261df..3bc90cf 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ fragment_builder:on_set :: {entity, fragment, component, component?} -> fragment fragment_builder:on_assign :: {entity, fragment, component, component} -> fragment_builder fragment_builder:on_insert :: {entity, fragment, component} -> fragment_builder fragment_builder:on_remove :: {entity, fragment} -> fragment_builder +fragment_builder:on_destroy :: id -> fragment_builder fragment_builder:build :: fragment, boolean ``` diff --git a/develop/untests.lua b/develop/untests.lua index 4504dc7..4a49246 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -7107,3 +7107,15 @@ do assert(c2_es[1] == e2a and c2_es[2] == e2b and c2_es[3] == e12a and c2_es[4] == e12b) end end + +do + local fb = evo.fragment() + + local f1 = fb:build() + local f2 = fb:on_destroy(evo.DESTROY_ENTITY_POLICY):build() + local f3 = fb:on_destroy(evo.REMOVE_FRAGMENT_POLICY):build() + + assert(evo.get(f1, evo.ON_DESTROY) == nil) + assert(evo.get(f2, evo.ON_DESTROY) == evo.DESTROY_ENTITY_POLICY) + assert(evo.get(f3, evo.ON_DESTROY) == evo.REMOVE_FRAGMENT_POLICY) +end diff --git a/evolved.lua b/evolved.lua index 5d7e7ce..3a9ce73 100644 --- a/evolved.lua +++ b/evolved.lua @@ -6754,6 +6754,7 @@ end ---@field package __on_assign? evolved.set_hook ---@field package __on_insert? evolved.set_hook ---@field package __on_remove? evolved.remove_hook +---@field package __on_destroy? evolved.id ---@class evolved.fragment_builder : evolved.__fragment_builder local evolved_fragment_builder = {} @@ -6773,6 +6774,7 @@ __evolved_fragment = function() __on_assign = nil, __on_insert = nil, __on_remove = nil, + __on_destroy = nil, } ---@cast builder evolved.fragment_builder return __lua_setmetatable(builder, evolved_fragment_builder) @@ -6840,6 +6842,13 @@ function evolved_fragment_builder:on_remove(on_remove) return self end +---@param on_destroy evolved.id +---@return evolved.fragment_builder builder +function evolved_fragment_builder:on_destroy(on_destroy) + self.__on_destroy = on_destroy + return self +end + ---@return evolved.fragment fragment ---@return boolean is_deferred function evolved_fragment_builder:build() @@ -6853,6 +6862,7 @@ function evolved_fragment_builder:build() local on_assign = self.__on_assign local on_insert = self.__on_insert local on_remove = self.__on_remove + local on_destroy = self.__on_destroy self.__tag = false self.__name = nil @@ -6864,6 +6874,7 @@ function evolved_fragment_builder:build() self.__on_assign = nil self.__on_insert = nil self.__on_remove = nil + self.__on_destroy = nil local fragment = __evolved_id() @@ -6925,6 +6936,12 @@ function evolved_fragment_builder:build() component_list[component_count] = on_remove end + if on_destroy then + component_count = component_count + 1 + fragment_list[component_count] = __ON_DESTROY + component_list[component_count] = on_destroy + end + local _, is_deferred = __evolved_multi_set(fragment, fragment_list, component_list) __release_table(__table_pool_tag.fragment_list, fragment_list)