mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-15 04:15:28 +07:00
GROUP builtin fragment, system_builder method for it
This commit is contained in:
@@ -35,6 +35,7 @@ ON_ASSIGN :: fragment
|
||||
ON_INSERT :: fragment
|
||||
ON_REMOVE :: fragment
|
||||
|
||||
GROUP :: fragment
|
||||
PHASE :: fragment
|
||||
AFTER :: fragment
|
||||
|
||||
|
||||
@@ -8216,3 +8216,9 @@ do
|
||||
assert(not evo.has(g3, evo.NAME) and evo.get(g3, g3) == 42)
|
||||
assert(evo.get(g4, evo.NAME) == 'g4' and evo.get(g4, g4) == 43)
|
||||
end
|
||||
|
||||
do
|
||||
local g = evo.group():build()
|
||||
local s = evo.system():group(g):build()
|
||||
assert(evo.get(s, evo.GROUP) == g)
|
||||
end
|
||||
|
||||
71
evolved.lua
71
evolved.lua
@@ -114,6 +114,7 @@ local __entity_places = {} ---@type table<integer, integer>
|
||||
|
||||
local __structural_changes = 0 ---@type integer
|
||||
|
||||
local __group_systems = {} ---@type table<evolved.group, evolved.assoc_list>
|
||||
local __phase_systems = {} ---@type table<evolved.phase, evolved.assoc_list>
|
||||
local __system_dependencies = {} ---@type table<evolved.system, evolved.assoc_list>
|
||||
|
||||
@@ -581,6 +582,7 @@ local __ON_ASSIGN = __acquire_id()
|
||||
local __ON_INSERT = __acquire_id()
|
||||
local __ON_REMOVE = __acquire_id()
|
||||
|
||||
local __GROUP = __acquire_id()
|
||||
local __PHASE = __acquire_id()
|
||||
local __AFTER = __acquire_id()
|
||||
|
||||
@@ -8055,6 +8057,7 @@ end
|
||||
---@class (exact) evolved.__system_builder
|
||||
---@field package __name? string
|
||||
---@field package __single? evolved.component
|
||||
---@field package __group? evolved.group
|
||||
---@field package __phase? evolved.phase
|
||||
---@field package __after? evolved.system[]
|
||||
---@field package __query? evolved.query
|
||||
@@ -8073,6 +8076,7 @@ __evolved_system = function()
|
||||
local builder = {
|
||||
__name = nil,
|
||||
__single = nil,
|
||||
__group = nil,
|
||||
__phase = nil,
|
||||
__after = nil,
|
||||
__query = nil,
|
||||
@@ -8098,6 +8102,13 @@ function evolved_system_builder:single(single)
|
||||
return self
|
||||
end
|
||||
|
||||
---@param group evolved.group
|
||||
---@return evolved.system_builder builder
|
||||
function evolved_system_builder:group(group)
|
||||
self.__group = group
|
||||
return self
|
||||
end
|
||||
|
||||
---@param phase evolved.phase
|
||||
---@return evolved.system_builder builder
|
||||
function evolved_system_builder:phase(phase)
|
||||
@@ -8164,6 +8175,7 @@ end
|
||||
function evolved_system_builder:build()
|
||||
local name = self.__name
|
||||
local single = self.__single
|
||||
local group = self.__group
|
||||
local phase = self.__phase
|
||||
local after = self.__after
|
||||
local query = self.__query
|
||||
@@ -8173,6 +8185,7 @@ function evolved_system_builder:build()
|
||||
|
||||
self.__name = nil
|
||||
self.__single = nil
|
||||
self.__group = nil
|
||||
self.__phase = nil
|
||||
self.__after = nil
|
||||
self.__query = nil
|
||||
@@ -8198,6 +8211,12 @@ function evolved_system_builder:build()
|
||||
component_list[component_count] = single
|
||||
end
|
||||
|
||||
if group then
|
||||
component_count = component_count + 1
|
||||
fragment_list[component_count] = __GROUP
|
||||
component_list[component_count] = group
|
||||
end
|
||||
|
||||
if phase then
|
||||
component_count = component_count + 1
|
||||
fragment_list[component_count] = __PHASE
|
||||
@@ -8390,6 +8409,7 @@ assert(__evolved_insert(__ON_ASSIGN, __NAME, 'ON_ASSIGN'))
|
||||
assert(__evolved_insert(__ON_INSERT, __NAME, 'ON_INSERT'))
|
||||
assert(__evolved_insert(__ON_REMOVE, __NAME, 'ON_REMOVE'))
|
||||
|
||||
assert(__evolved_insert(__GROUP, __NAME, 'GROUP'))
|
||||
assert(__evolved_insert(__PHASE, __NAME, 'PHASE'))
|
||||
assert(__evolved_insert(__AFTER, __NAME, 'AFTER'))
|
||||
|
||||
@@ -8484,6 +8504,56 @@ end))
|
||||
---
|
||||
---
|
||||
|
||||
---@param system evolved.system
|
||||
---@param new_group evolved.group
|
||||
---@param old_group? evolved.group
|
||||
assert(__evolved_insert(__GROUP, __ON_SET, function(system, _, new_group, old_group)
|
||||
if new_group == old_group then
|
||||
return
|
||||
end
|
||||
|
||||
if old_group then
|
||||
local old_group_systems = __group_systems[old_group]
|
||||
|
||||
if old_group_systems then
|
||||
__assoc_list_remove(old_group_systems, system)
|
||||
|
||||
if old_group_systems.__item_count == 0 then
|
||||
__group_systems[old_group] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local new_group_systems = __group_systems[new_group]
|
||||
|
||||
if not new_group_systems then
|
||||
new_group_systems = __assoc_list_new(4)
|
||||
__group_systems[new_group] = new_group_systems
|
||||
end
|
||||
|
||||
__assoc_list_insert(new_group_systems, system)
|
||||
end))
|
||||
|
||||
---@param system evolved.system
|
||||
---@param old_group evolved.group
|
||||
assert(__evolved_insert(__GROUP, __ON_REMOVE, function(system, _, old_group)
|
||||
local old_group_systems = __group_systems[old_group]
|
||||
|
||||
if old_group_systems then
|
||||
__assoc_list_remove(old_group_systems, system)
|
||||
|
||||
if old_group_systems.__item_count == 0 then
|
||||
__group_systems[old_group] = nil
|
||||
end
|
||||
end
|
||||
end))
|
||||
|
||||
---
|
||||
---
|
||||
---
|
||||
---
|
||||
---
|
||||
|
||||
---@param system evolved.system
|
||||
---@param new_phase evolved.phase
|
||||
---@param old_phase? evolved.phase
|
||||
@@ -8579,6 +8649,7 @@ evolved.ON_ASSIGN = __ON_ASSIGN
|
||||
evolved.ON_INSERT = __ON_INSERT
|
||||
evolved.ON_REMOVE = __ON_REMOVE
|
||||
|
||||
evolved.GROUP = __GROUP
|
||||
evolved.PHASE = __PHASE
|
||||
evolved.AFTER = __AFTER
|
||||
|
||||
|
||||
Reference in New Issue
Block a user