groups and phases are just systems now

This commit is contained in:
BlackMATov
2025-04-09 00:44:43 +07:00
parent a325976d07
commit 8819616a80
4 changed files with 90 additions and 663 deletions

View File

@@ -40,9 +40,7 @@ ON_ASSIGN :: fragment
ON_INSERT :: fragment ON_INSERT :: fragment
ON_REMOVE :: fragment ON_REMOVE :: fragment
PHASE :: fragment
GROUP :: fragment GROUP :: fragment
AFTER :: fragment
QUERY :: fragment QUERY :: fragment
EXECUTE :: fragment EXECUTE :: fragment
@@ -107,7 +105,7 @@ components :: chunk, fragment... -> component[]...
each :: entity -> {each_state? -> fragment?, component?}, each_state? each :: entity -> {each_state? -> fragment?, component?}, each_state?
execute :: query -> {execute_state? -> chunk?, entity[]?, integer?}, execute_state? execute :: query -> {execute_state? -> chunk?, entity[]?, integer?}, execute_state?
process :: phase... -> () process :: system... -> ()
spawn_at :: chunk?, fragment[]?, component[]? -> entity spawn_at :: chunk?, fragment[]?, component[]? -> entity
spawn_as :: entity?, fragment[]?, component[]? -> entity spawn_as :: entity?, fragment[]?, component[]? -> entity
@@ -149,38 +147,16 @@ query_builder:exclude :: fragment... -> query_builder
query_builder:build :: query query_builder:build :: query
``` ```
```
group :: group_builder
group_builder:name :: string -> group_builder
group_builder:single :: component -> group_builder
group_builder:disable :: group_builder
group_builder:phase :: phase -> group_builder
group_builder:after :: group... -> group_builder
group_builder:prologue :: {} -> group_builder
group_builder:epilogue :: {} -> group_builder
group_builder:build :: group
```
```
phase :: phase_builder
phase_builder:name :: string -> phase_builder
phase_builder:single :: component -> phase_builder
phase_builder:disable :: phase_builder
phase_builder:prologue :: {} -> phase_builder
phase_builder:epilogue :: {} -> phase_builder
phase_builder:build :: phase
```
``` ```
system :: system_builder system :: system_builder
system_builder:name :: string -> system_builder system_builder:name :: string -> system_builder
system_builder:single :: component -> system_builder system_builder:single :: component -> system_builder
system_builder:disable :: system_builder system_builder:group :: system -> system_builder
system_builder:group :: group -> system_builder
system_builder:query :: query -> system_builder system_builder:query :: query -> system_builder
system_builder:execute :: {chunk, entity[], integer} -> system_builder system_builder:execute :: {chunk, entity[], integer} -> system_builder
system_builder:prologue :: {} -> system_builder system_builder:prologue :: {} -> system_builder
system_builder:epilogue :: {} -> system_builder system_builder:epilogue :: {} -> system_builder
system_builder:disabled :: system_builder
system_builder:build :: system system_builder:build :: system
``` ```

View File

@@ -15,18 +15,11 @@ local function vector2(x, y)
return { x = x, y = y } return { x = x, y = y }
end end
local phases = {
awake = evo.phase():build(),
physics = evo.phase():build(),
graphics = evo.phase():build(),
shutdown = evo.phase():build(),
}
local groups = { local groups = {
awake = evo.group():phase(phases.awake):build(), awake = evo.system():build(),
physics = evo.group():phase(phases.physics):build(), physics = evo.system():build(),
graphics = evo.group():phase(phases.graphics):build(), graphics = evo.system():build(),
shutdown = evo.group():phase(phases.shutdown):build(), shutdown = evo.system():build(),
} }
local singles = { local singles = {
@@ -126,12 +119,12 @@ local shutdown_system = evo.system()
end):build() end):build()
do do
evo.process(phases.awake) evo.process(groups.awake)
for _ = 1, 10 do for _ = 1, 10 do
evo.process(phases.physics) evo.process(groups.physics)
evo.process(phases.graphics) evo.process(groups.graphics)
end end
evo.process(phases.shutdown) evo.process(groups.shutdown)
end end

View File

@@ -5929,9 +5929,6 @@ do
local q = evo.query():build() local q = evo.query():build()
assert(evo.get(q, evo.NAME) == nil) assert(evo.get(q, evo.NAME) == nil)
local p = evo.phase():build()
assert(evo.get(p, evo.NAME) == nil)
local s = evo.system():build() local s = evo.system():build()
assert(evo.get(s, evo.NAME) == nil) assert(evo.get(s, evo.NAME) == nil)
end end
@@ -5939,7 +5936,6 @@ end
do do
local fb = evo.fragment() local fb = evo.fragment()
local qb = evo.query() local qb = evo.query()
local pb = evo.phase()
local sb = evo.system() local sb = evo.system()
do do
@@ -5949,9 +5945,6 @@ do
local q = qb:name('query'):build() local q = qb:name('query'):build()
assert(evo.get(q, evo.NAME) == 'query') assert(evo.get(q, evo.NAME) == 'query')
local p = pb:name('phase'):build()
assert(evo.get(p, evo.NAME) == 'phase')
local s = sb:name('system'):build() local s = sb:name('system'):build()
assert(evo.get(s, evo.NAME) == 'system') assert(evo.get(s, evo.NAME) == 'system')
end end
@@ -5963,9 +5956,6 @@ do
local q = qb:build() local q = qb:build()
assert(evo.get(q, evo.NAME) == nil) assert(evo.get(q, evo.NAME) == nil)
local p = pb:build()
assert(evo.get(p, evo.NAME) == nil)
local s = sb:build() local s = sb:build()
assert(evo.get(s, evo.NAME) == nil) assert(evo.get(s, evo.NAME) == nil)
end end
@@ -5974,7 +5964,6 @@ end
do do
local fb = evo.fragment() local fb = evo.fragment()
local qb = evo.query() local qb = evo.query()
local pb = evo.phase()
local sb = evo.system() local sb = evo.system()
do do
@@ -5984,9 +5973,6 @@ do
local q = qb:single(false):build() local q = qb:single(false):build()
assert(evo.get(q, q) == false) assert(evo.get(q, q) == false)
local p = pb:single(false):build()
assert(evo.get(p, p) == false)
local s = sb:single(false):build() local s = sb:single(false):build()
assert(evo.get(s, s) == false) assert(evo.get(s, s) == false)
end end
@@ -5998,9 +5984,6 @@ do
local q = qb:build() local q = qb:build()
assert(evo.get(q, q) == nil) assert(evo.get(q, q) == nil)
local p = pb:build()
assert(evo.get(p, p) == nil)
local s = sb:build() local s = sb:build()
assert(evo.get(s, s) == nil) assert(evo.get(s, s) == nil)
end end
@@ -7315,7 +7298,7 @@ do
end end
do do
local gb = evo.group() local gb = evo.system()
local g1 = gb:build() local g1 = gb:build()
local g2 = gb:name('g2'):build() local g2 = gb:name('g2'):build()
@@ -7329,31 +7312,11 @@ do
end end
do do
local g = evo.group():build() local g = evo.system():build()
local s = evo.system():group(g):build() local s = evo.system():group(g):build()
assert(evo.get(s, evo.GROUP) == g) assert(evo.get(s, evo.GROUP) == g)
end end
do
local s1 = evo.group():build()
do
local after = evo.get(s1, evo.AFTER)
assert(after == nil)
end
local g2 = evo.group():after(s1):build()
do
local after = evo.get(g2, evo.AFTER)
assert(#after == 1 and after[1] == s1)
end
local g3 = evo.group():after(s1, g2):build()
do
local after = evo.get(g3, evo.AFTER)
assert(#after == 2 and after[1] == s1 and after[2] == g2)
end
end
do do
local f1 = evo.id() local f1 = evo.id()
local c1 = evo.chunk(f1) local c1 = evo.chunk(f1)

View File

@@ -32,8 +32,6 @@ local evolved = {
---@alias evolved.entity evolved.id ---@alias evolved.entity evolved.id
---@alias evolved.fragment evolved.id ---@alias evolved.fragment evolved.id
---@alias evolved.query evolved.id ---@alias evolved.query evolved.id
---@alias evolved.group evolved.id
---@alias evolved.phase evolved.id
---@alias evolved.system evolved.id ---@alias evolved.system evolved.id
---@alias evolved.component any ---@alias evolved.component any
@@ -116,9 +114,7 @@ local __entity_places = {} ---@type table<integer, integer>
local __structural_changes = 0 ---@type integer local __structural_changes = 0 ---@type integer
local __phase_groups = {} ---@type table<evolved.phase, evolved.assoc_list> local __group_subsystems = {} ---@type table<evolved.system, evolved.assoc_list>
local __group_systems = {} ---@type table<evolved.group, evolved.assoc_list>
local __group_dependencies = {} ---@type table<evolved.group, evolved.assoc_list>
local __query_sorted_includes = {} ---@type table<evolved.query, evolved.assoc_list> local __query_sorted_includes = {} ---@type table<evolved.query, evolved.assoc_list>
local __query_sorted_excludes = {} ---@type table<evolved.query, evolved.assoc_list> local __query_sorted_excludes = {} ---@type table<evolved.query, evolved.assoc_list>
@@ -360,17 +356,15 @@ end
local __table_pool_tag = { local __table_pool_tag = {
bytecode = 1, bytecode = 1,
chunk_stack = 2, chunk_stack = 2,
each_state = 3, system_list = 3,
execute_state = 4, each_state = 4,
entity_set = 5, execute_state = 5,
entity_list = 6, entity_set = 6,
fragment_set = 7, entity_list = 7,
fragment_list = 8, fragment_set = 8,
component_list = 9, fragment_list = 9,
group_list = 10, component_list = 10,
sorting_stack = 11, __count = 10,
sorting_marks = 12,
__count = 12,
} }
---@class (exact) evolved.table_pool ---@class (exact) evolved.table_pool
@@ -661,9 +655,7 @@ local __ON_ASSIGN = __acquire_id()
local __ON_INSERT = __acquire_id() local __ON_INSERT = __acquire_id()
local __ON_REMOVE = __acquire_id() local __ON_REMOVE = __acquire_id()
local __PHASE = __acquire_id()
local __GROUP = __acquire_id() local __GROUP = __acquire_id()
local __AFTER = __acquire_id()
local __QUERY = __acquire_id() local __QUERY = __acquire_id()
local __EXECUTE = __acquire_id() local __EXECUTE = __acquire_id()
@@ -1051,20 +1043,20 @@ function __debug_fns.validate_query(query)
end end
end end
---@param phase evolved.phase ---@param system evolved.system
function __debug_fns.validate_phase(phase) function __debug_fns.validate_system(system)
local phase_index = phase % 0x100000 local system_index = system % 0x100000
if __freelist_ids[phase_index] ~= phase then if __freelist_ids[system_index] ~= system then
__error_fmt('the phase (%s) is not alive and cannot be used', __error_fmt('the system (%s) is not alive and cannot be used',
__id_name(phase)) __id_name(system))
end end
end end
---@param ... evolved.phase phases ---@param ... evolved.system systems
function __debug_fns.validate_phases(...) function __debug_fns.validate_systems(...)
for i = 1, __lua_select('#', ...) do for i = 1, __lua_select('#', ...) do
__debug_fns.validate_phase(__lua_select(i, ...)) __debug_fns.validate_system(__lua_select(i, ...))
end end
end end
@@ -3463,6 +3455,29 @@ local function __system_process(system)
__evolved_commit() __evolved_commit()
end end
do
local group_subsystems = __group_subsystems[system]
local group_subsystem_list = group_subsystems and group_subsystems.__item_list --[=[@as evolved.system[]]=]
local group_subsystem_count = group_subsystems and group_subsystems.__item_count or 0 --[[@as integer]]
if group_subsystem_count > 0 then
local subsystem_list = __acquire_table(__table_pool_tag.system_list)
__lua_table_move(
group_subsystem_list, 1, group_subsystem_count,
1, subsystem_list)
for subsystem_index = 1, group_subsystem_count do
local subsystem = subsystem_list[subsystem_index]
if not __evolved_has(subsystem, __DISABLED) then
__system_process(subsystem)
end
end
__release_table(__table_pool_tag.system_list, subsystem_list)
end
end
if epilogue then if epilogue then
local success, result = __lua_pcall(epilogue) local success, result = __lua_pcall(epilogue)
@@ -3472,165 +3487,6 @@ local function __system_process(system)
end end
end end
---@param group evolved.group
local function __group_process(group)
---@type evolved.prologue?, evolved.epilogue?
local prologue, epilogue = __evolved_get(group,
__PROLOGUE, __EPILOGUE)
if prologue then
local success, result = __lua_pcall(prologue)
if not success then
__error_fmt('group prologue failed: %s', result)
end
end
do
local group_systems = __group_systems[group]
local group_system_list = group_systems and group_systems.__item_list --[=[@as evolved.system[]]=]
local group_system_count = group_systems and group_systems.__item_count or 0 --[[@as integer]]
for group_system_index = 1, group_system_count do
local group_system = group_system_list[group_system_index]
if not __evolved_has(group_system, __DISABLED) then
__system_process(group_system)
end
end
end
if epilogue then
local success, result = __lua_pcall(epilogue)
if not success then
__error_fmt('group epilogue failed: %s', result)
end
end
end
---@param phase evolved.phase
local function __phase_process(phase)
---@type evolved.prologue?, evolved.epilogue?
local prologue, epilogue = __evolved_get(phase,
__PROLOGUE, __EPILOGUE)
if prologue then
local success, result = __lua_pcall(prologue)
if not success then
__error_fmt('phase prologue failed: %s', result)
end
end
do
local phase_groups = __phase_groups[phase]
local phase_group_set = phase_groups and phase_groups.__item_set --[[@as table<evolved.group, integer>]]
local phase_group_list = phase_groups and phase_groups.__item_list --[=[@as evolved.group[]]=]
local phase_group_count = phase_groups and phase_groups.__item_count or 0 --[[@as integer]]
---@type evolved.group[]
local sorted_group_list = __acquire_table(__table_pool_tag.group_list)
local sorted_group_count = 0
---@type integer[]
local sorting_marks = __acquire_table(__table_pool_tag.sorting_marks)
---@type evolved.group[]
local sorting_stack = __acquire_table(__table_pool_tag.sorting_stack)
local sorting_stack_size = phase_group_count
for phase_group_index = 1, phase_group_count do
sorting_marks[phase_group_index] = 0
local phase_group_rev_index = phase_group_count - phase_group_index + 1
sorting_stack[phase_group_index] = phase_group_list[phase_group_rev_index]
end
while sorting_stack_size > 0 do
local group = sorting_stack[sorting_stack_size]
local group_mark_index = phase_group_set[group]
local group_mark = sorting_marks[group_mark_index]
if not group_mark then
-- the group has already been added to the sorted list
sorting_stack[sorting_stack_size] = nil
sorting_stack_size = sorting_stack_size - 1
elseif group_mark == 0 then
sorting_marks[group_mark_index] = 1
local dependencies = __group_dependencies[group]
local dependency_list = dependencies and dependencies.__item_list --[=[@as evolved.group[]]=]
local dependency_count = dependencies and dependencies.__item_count or 0 --[[@as integer]]
for dependency_index = dependency_count, 1, -1 do
local dependency = dependency_list[dependency_index]
local dependency_mark_index = phase_group_set[dependency]
if not dependency_mark_index then
-- the dependency is not from this phase
else
local dependency_mark = sorting_marks[dependency_mark_index]
if not dependency_mark then
-- the dependency has already been added to the sorted list
elseif dependency_mark == 0 then
sorting_stack_size = sorting_stack_size + 1
sorting_stack[sorting_stack_size] = dependency
elseif dependency_mark == 1 then
local sorting_cycle_path = '' .. __id_name(dependency)
for cycled_group_index = sorting_stack_size, 1, -1 do
local cycled_group = sorting_stack[cycled_group_index]
local cycled_group_mark_index = phase_group_set[cycled_group]
local cycled_group_mark = sorting_marks[cycled_group_mark_index]
if cycled_group_mark == 1 then
sorting_cycle_path = string.format('%s -> %s',
sorting_cycle_path, __id_name(cycled_group))
if cycled_group == dependency then
break
end
end
end
__error_fmt('cyclic dependency detected: %s', sorting_cycle_path)
end
end
end
elseif group_mark == 1 then
sorting_marks[group_mark_index] = nil
sorted_group_count = sorted_group_count + 1
sorted_group_list[sorted_group_count] = group
sorting_stack[sorting_stack_size] = nil
sorting_stack_size = sorting_stack_size - 1
end
end
for sorted_group_index = 1, sorted_group_count do
local sorted_group = sorted_group_list[sorted_group_index]
if not __evolved_has(sorted_group, __DISABLED) then
__group_process(sorted_group)
end
end
__release_table(__table_pool_tag.group_list, sorted_group_list)
__release_table(__table_pool_tag.sorting_marks, sorting_marks, true)
__release_table(__table_pool_tag.sorting_stack, sorting_stack, true)
end
if epilogue then
local success, result = __lua_pcall(epilogue)
if not success then
__error_fmt('phase epilogue failed: %s', result)
end
end
end
--- ---
--- ---
--- ---
@@ -6077,13 +5933,17 @@ __evolved_execute = function(query)
return __execute_iterator, execute_state return __execute_iterator, execute_state
end end
---@param ... evolved.phase phases ---@param ... evolved.system systems
__evolved_process = function(...) __evolved_process = function(...)
if __debug_mode then
__debug_fns.validate_systems(...)
end
for i = 1, __lua_select('#', ...) do for i = 1, __lua_select('#', ...) do
---@type evolved.phase ---@type evolved.system
local phase = __lua_select(i, ...) local system = __lua_select(i, ...)
if not __evolved_has(phase, __DISABLED) then if not __evolved_has(system, __DISABLED) then
__phase_process(phase) __system_process(system)
end end
end end
end end
@@ -6324,35 +6184,15 @@ __builder_fns.fragment_builder.__index = __builder_fns.fragment_builder
__builder_fns.query_builder = {} __builder_fns.query_builder = {}
__builder_fns.query_builder.__index = __builder_fns.query_builder __builder_fns.query_builder.__index = __builder_fns.query_builder
---@class evolved.group_builder
---@field package __name? string
---@field package __single? evolved.component
---@field package __disable? boolean
---@field package __phase? evolved.phase
---@field package __after? evolved.group[]
---@field package __prologue? evolved.prologue
---@field package __epilogue? evolved.epilogue
__builder_fns.group_builder = {}
__builder_fns.group_builder.__index = __builder_fns.group_builder
---@class evolved.phase_builder
---@field package __name? string
---@field package __single? evolved.component
---@field package __disable? boolean
---@field package __prologue? evolved.prologue
---@field package __epilogue? evolved.epilogue
__builder_fns.phase_builder = {}
__builder_fns.phase_builder.__index = __builder_fns.phase_builder
---@class evolved.system_builder ---@class evolved.system_builder
---@field package __name? string ---@field package __name? string
---@field package __single? evolved.component ---@field package __single? evolved.component
---@field package __disable? boolean ---@field package __group? evolved.system
---@field package __group? evolved.group
---@field package __query? evolved.query ---@field package __query? evolved.query
---@field package __execute? evolved.execute ---@field package __execute? evolved.execute
---@field package __prologue? evolved.prologue ---@field package __prologue? evolved.prologue
---@field package __epilogue? evolved.epilogue ---@field package __epilogue? evolved.epilogue
---@field package __disabled? boolean
__builder_fns.system_builder = {} __builder_fns.system_builder = {}
__builder_fns.system_builder.__index = __builder_fns.system_builder __builder_fns.system_builder.__index = __builder_fns.system_builder
@@ -6735,263 +6575,6 @@ end
--- ---
--- ---
---@return evolved.group_builder builder
---@nodiscard
__evolved_group = function()
return __lua_setmetatable({}, __builder_fns.group_builder)
end
---@param name string
---@return evolved.group_builder builder
function __builder_fns.group_builder:name(name)
self.__name = name
return self
end
---@param single evolved.component
---@return evolved.group_builder builder
function __builder_fns.group_builder:single(single)
self.__single = single
return self
end
---@return evolved.group_builder builder
function __builder_fns.group_builder:disable()
self.__disable = true
return self
end
---@param phase evolved.phase
---@return evolved.group_builder builder
function __builder_fns.group_builder:phase(phase)
self.__phase = phase
return self
end
---@param ... evolved.group groups
---@return evolved.group_builder builder
function __builder_fns.group_builder:after(...)
local group_count = __lua_select('#', ...)
if group_count == 0 then
return self
end
local after = self.__after
if not after then
after = __lua_table_new(group_count, 0)
self.__after = after
end
local after_count = #after
for i = 1, group_count do
after_count = after_count + 1
after[after_count] = __lua_select(i, ...)
end
return self
end
---@param prologue evolved.prologue
---@return evolved.group_builder builder
function __builder_fns.group_builder:prologue(prologue)
self.__prologue = prologue
return self
end
---@param epilogue evolved.epilogue
---@return evolved.group_builder builder
function __builder_fns.group_builder:epilogue(epilogue)
self.__epilogue = epilogue
return self
end
---@return evolved.group group
function __builder_fns.group_builder:build()
local name = self.__name
local single = self.__single
local disable = self.__disable
local phase = self.__phase
local after = self.__after
local prologue = self.__prologue
local epilogue = self.__epilogue
self.__name = nil
self.__single = nil
self.__disable = nil
self.__phase = nil
self.__after = nil
self.__prologue = nil
self.__epilogue = nil
local group = __evolved_id()
local fragment_list = __acquire_table(__table_pool_tag.fragment_list)
local component_list = __acquire_table(__table_pool_tag.component_list)
local component_count = 0
if name then
component_count = component_count + 1
fragment_list[component_count] = __NAME
component_list[component_count] = name
end
if single ~= nil then
component_count = component_count + 1
fragment_list[component_count] = group
component_list[component_count] = single
end
if disable then
component_count = component_count + 1
fragment_list[component_count] = __DISABLED
component_list[component_count] = true
end
if phase then
component_count = component_count + 1
fragment_list[component_count] = __PHASE
component_list[component_count] = phase
end
if after then
component_count = component_count + 1
fragment_list[component_count] = __AFTER
component_list[component_count] = after
end
if prologue then
component_count = component_count + 1
fragment_list[component_count] = __PROLOGUE
component_list[component_count] = prologue
end
if epilogue then
component_count = component_count + 1
fragment_list[component_count] = __EPILOGUE
component_list[component_count] = epilogue
end
__evolved_multi_set(group, fragment_list, component_list)
__release_table(__table_pool_tag.fragment_list, fragment_list)
__release_table(__table_pool_tag.component_list, component_list)
return group
end
---
---
---
---
---
---@return evolved.phase_builder builder
---@nodiscard
__evolved_phase = function()
return __lua_setmetatable({}, __builder_fns.phase_builder)
end
---@param name string
---@return evolved.phase_builder builder
function __builder_fns.phase_builder:name(name)
self.__name = name
return self
end
---@param single evolved.component
---@return evolved.phase_builder builder
function __builder_fns.phase_builder:single(single)
self.__single = single
return self
end
---@return evolved.phase_builder builder
function __builder_fns.phase_builder:disable()
self.__disable = true
return self
end
---@param prologue evolved.prologue
---@return evolved.phase_builder builder
function __builder_fns.phase_builder:prologue(prologue)
self.__prologue = prologue
return self
end
---@param epilogue evolved.epilogue
---@return evolved.phase_builder builder
function __builder_fns.phase_builder:epilogue(epilogue)
self.__epilogue = epilogue
return self
end
---@return evolved.phase phase
function __builder_fns.phase_builder:build()
local name = self.__name
local single = self.__single
local disable = self.__disable
local prologue = self.__prologue
local epilogue = self.__epilogue
self.__name = nil
self.__single = nil
self.__disable = nil
self.__prologue = nil
self.__epilogue = nil
local phase = __evolved_id()
local fragment_list = __acquire_table(__table_pool_tag.fragment_list)
local component_list = __acquire_table(__table_pool_tag.component_list)
local component_count = 0
if name then
component_count = component_count + 1
fragment_list[component_count] = __NAME
component_list[component_count] = name
end
if single ~= nil then
component_count = component_count + 1
fragment_list[component_count] = phase
component_list[component_count] = single
end
if disable then
component_count = component_count + 1
fragment_list[component_count] = __DISABLED
component_list[component_count] = true
end
if prologue then
component_count = component_count + 1
fragment_list[component_count] = __PROLOGUE
component_list[component_count] = prologue
end
if epilogue then
component_count = component_count + 1
fragment_list[component_count] = __EPILOGUE
component_list[component_count] = epilogue
end
__evolved_multi_set(phase, fragment_list, component_list)
__release_table(__table_pool_tag.fragment_list, fragment_list)
__release_table(__table_pool_tag.component_list, component_list)
return phase
end
---
---
---
---
---
---@return evolved.system_builder builder ---@return evolved.system_builder builder
---@nodiscard ---@nodiscard
__evolved_system = function() __evolved_system = function()
@@ -7012,13 +6595,7 @@ function __builder_fns.system_builder:single(single)
return self return self
end end
---@return evolved.system_builder builder ---@param group evolved.system
function __builder_fns.system_builder:disable()
self.__disable = true
return self
end
---@param group evolved.group
---@return evolved.system_builder builder ---@return evolved.system_builder builder
function __builder_fns.system_builder:group(group) function __builder_fns.system_builder:group(group)
self.__group = group self.__group = group
@@ -7053,25 +6630,31 @@ function __builder_fns.system_builder:epilogue(epilogue)
return self return self
end end
---@return evolved.system_builder builder
function __builder_fns.system_builder:disabled()
self.__disabled = true
return self
end
---@return evolved.system system ---@return evolved.system system
function __builder_fns.system_builder:build() function __builder_fns.system_builder:build()
local name = self.__name local name = self.__name
local single = self.__single local single = self.__single
local disable = self.__disable
local group = self.__group local group = self.__group
local query = self.__query local query = self.__query
local execute = self.__execute local execute = self.__execute
local prologue = self.__prologue local prologue = self.__prologue
local epilogue = self.__epilogue local epilogue = self.__epilogue
local disabled = self.__disabled
self.__name = nil self.__name = nil
self.__single = nil self.__single = nil
self.__disable = nil
self.__group = nil self.__group = nil
self.__query = nil self.__query = nil
self.__execute = nil self.__execute = nil
self.__prologue = nil self.__prologue = nil
self.__epilogue = nil self.__epilogue = nil
self.__disabled = nil
local system = __evolved_id() local system = __evolved_id()
@@ -7091,12 +6674,6 @@ function __builder_fns.system_builder:build()
component_list[component_count] = single component_list[component_count] = single
end end
if disable then
component_count = component_count + 1
fragment_list[component_count] = __DISABLED
component_list[component_count] = true
end
if group then if group then
component_count = component_count + 1 component_count = component_count + 1
fragment_list[component_count] = __GROUP fragment_list[component_count] = __GROUP
@@ -7127,6 +6704,12 @@ function __builder_fns.system_builder:build()
component_list[component_count] = epilogue component_list[component_count] = epilogue
end end
if disabled then
component_count = component_count + 1
fragment_list[component_count] = __DISABLED
component_list[component_count] = true
end
__evolved_multi_set(system, fragment_list, component_list) __evolved_multi_set(system, fragment_list, component_list)
__release_table(__table_pool_tag.fragment_list, fragment_list) __release_table(__table_pool_tag.fragment_list, fragment_list)
@@ -7291,9 +6874,7 @@ __evolved_set(__ON_ASSIGN, __NAME, 'ON_ASSIGN')
__evolved_set(__ON_INSERT, __NAME, 'ON_INSERT') __evolved_set(__ON_INSERT, __NAME, 'ON_INSERT')
__evolved_set(__ON_REMOVE, __NAME, 'ON_REMOVE') __evolved_set(__ON_REMOVE, __NAME, 'ON_REMOVE')
__evolved_set(__PHASE, __NAME, 'PHASE')
__evolved_set(__GROUP, __NAME, 'GROUP') __evolved_set(__GROUP, __NAME, 'GROUP')
__evolved_set(__AFTER, __NAME, 'AFTER')
__evolved_set(__QUERY, __NAME, 'QUERY') __evolved_set(__QUERY, __NAME, 'QUERY')
__evolved_set(__EXECUTE, __NAME, 'EXECUTE') __evolved_set(__EXECUTE, __NAME, 'EXECUTE')
@@ -7321,9 +6902,6 @@ __evolved_set(__INCLUDES, __DUPLICATE, __list_copy)
__evolved_set(__EXCLUDES, __DEFAULT, {}) __evolved_set(__EXCLUDES, __DEFAULT, {})
__evolved_set(__EXCLUDES, __DUPLICATE, __list_copy) __evolved_set(__EXCLUDES, __DUPLICATE, __list_copy)
__evolved_set(__AFTER, __DEFAULT, {})
__evolved_set(__AFTER, __DUPLICATE, __list_copy)
__evolved_set(__DISABLED, __TAG) __evolved_set(__DISABLED, __TAG)
--- ---
@@ -7394,96 +6972,46 @@ end)
--- ---
--- ---
---@param group evolved.group
---@param new_phase evolved.phase
---@param old_phase? evolved.phase
__evolved_set(__PHASE, __ON_SET, function(group, _, new_phase, old_phase)
if new_phase == old_phase then
return
end
if old_phase then
local old_phase_groups = __phase_groups[old_phase]
if old_phase_groups then
__assoc_list_remove(old_phase_groups, group)
if old_phase_groups.__item_count == 0 then
__phase_groups[old_phase] = nil
end
end
end
local new_phase_groups = __phase_groups[new_phase]
if not new_phase_groups then
new_phase_groups = __assoc_list_new(4)
__phase_groups[new_phase] = new_phase_groups
end
__assoc_list_insert(new_phase_groups, group)
end)
---@param group evolved.group
---@param old_phase evolved.phase
__evolved_set(__PHASE, __ON_REMOVE, function(group, _, old_phase)
local old_phase_groups = __phase_groups[old_phase]
if old_phase_groups then
__assoc_list_remove(old_phase_groups, group)
if old_phase_groups.__item_count == 0 then
__phase_groups[old_phase] = nil
end
end
end)
---
---
---
---
---
---@param system evolved.system ---@param system evolved.system
---@param new_group evolved.group ---@param new_group evolved.system
---@param old_group? evolved.group ---@param old_group? evolved.system
__evolved_set(__GROUP, __ON_SET, function(system, _, new_group, old_group) __evolved_set(__GROUP, __ON_SET, function(system, _, new_group, old_group)
if new_group == old_group then if new_group == old_group then
return return
end end
if old_group then if old_group then
local old_group_systems = __group_systems[old_group] local old_group_systems = __group_subsystems[old_group]
if old_group_systems then if old_group_systems then
__assoc_list_remove(old_group_systems, system) __assoc_list_remove(old_group_systems, system)
if old_group_systems.__item_count == 0 then if old_group_systems.__item_count == 0 then
__group_systems[old_group] = nil __group_subsystems[old_group] = nil
end end
end end
end end
local new_group_systems = __group_systems[new_group] local new_group_systems = __group_subsystems[new_group]
if not new_group_systems then if not new_group_systems then
new_group_systems = __assoc_list_new(4) new_group_systems = __assoc_list_new(4)
__group_systems[new_group] = new_group_systems __group_subsystems[new_group] = new_group_systems
end end
__assoc_list_insert(new_group_systems, system) __assoc_list_insert(new_group_systems, system)
end) end)
---@param system evolved.system ---@param system evolved.system
---@param old_group evolved.group ---@param old_group evolved.system
__evolved_set(__GROUP, __ON_REMOVE, function(system, _, old_group) __evolved_set(__GROUP, __ON_REMOVE, function(system, _, old_group)
local old_group_systems = __group_systems[old_group] local old_group_systems = __group_subsystems[old_group]
if old_group_systems then if old_group_systems then
__assoc_list_remove(old_group_systems, system) __assoc_list_remove(old_group_systems, system)
if old_group_systems.__item_count == 0 then if old_group_systems.__item_count == 0 then
__group_systems[old_group] = nil __group_subsystems[old_group] = nil
end end
end end
end) end)
@@ -7494,37 +7022,6 @@ end)
--- ---
--- ---
---@param group evolved.group
---@param new_after_list evolved.group[]
__evolved_set(__AFTER, __ON_SET, function(group, _, new_after_list)
local new_after_count = #new_after_list
if new_after_count == 0 then
__group_dependencies[group] = nil
return
end
local new_dependencies = __assoc_list_new(new_after_count)
for new_after_index = 1, new_after_count do
local new_after = new_after_list[new_after_index]
__assoc_list_insert(new_dependencies, new_after)
end
__group_dependencies[group] = new_dependencies
end)
---@param group evolved.group
__evolved_set(__AFTER, __ON_REMOVE, function(group)
__group_dependencies[group] = nil
end)
---
---
---
---
---
evolved.TAG = __TAG evolved.TAG = __TAG
evolved.NAME = __NAME evolved.NAME = __NAME
evolved.DEFAULT = __DEFAULT evolved.DEFAULT = __DEFAULT
@@ -7538,9 +7035,7 @@ evolved.ON_ASSIGN = __ON_ASSIGN
evolved.ON_INSERT = __ON_INSERT evolved.ON_INSERT = __ON_INSERT
evolved.ON_REMOVE = __ON_REMOVE evolved.ON_REMOVE = __ON_REMOVE
evolved.PHASE = __PHASE
evolved.GROUP = __GROUP evolved.GROUP = __GROUP
evolved.AFTER = __AFTER
evolved.QUERY = __QUERY evolved.QUERY = __QUERY
evolved.EXECUTE = __EXECUTE evolved.EXECUTE = __EXECUTE