mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-14 20:11:27 +07:00
alive/empty/has for new ids/pairs
This commit is contained in:
@@ -515,6 +515,126 @@ do
|
|||||||
assert(evo.has(e, evo.pair(evo.ANY, s2)))
|
assert(evo.has(e, evo.pair(evo.ANY, s2)))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--[[ wildcard getting
|
||||||
|
do
|
||||||
|
local p, s1, s2 = evo.id(3)
|
||||||
|
|
||||||
|
do
|
||||||
|
local e = evo.builder()
|
||||||
|
:set(evo.pair(p, s1), 42)
|
||||||
|
:spawn()
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(p, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(p, s1)) == 42)
|
||||||
|
|
||||||
|
assert(not evo.has(e, evo.pair(p, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(p, s2)) == nil)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(p, evo.ANY)))
|
||||||
|
assert(evo.get(e, evo.pair(p, evo.ANY)) == 42)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(evo.ANY, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(evo.ANY, s1)) == 42)
|
||||||
|
|
||||||
|
assert(not evo.has(e, evo.pair(evo.ANY, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(evo.ANY, s2)) == nil)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(evo.ANY, evo.ANY)))
|
||||||
|
assert(evo.get(e, evo.pair(evo.ANY, evo.ANY)) == 42)
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local e = evo.builder()
|
||||||
|
:set(evo.pair(p, s1), 42)
|
||||||
|
:set(evo.pair(p, s2), 84)
|
||||||
|
:spawn()
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(p, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(p, s1)) == 42)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(p, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(p, s2)) == 84)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(p, evo.ANY)))
|
||||||
|
assert(evo.get(e, evo.pair(p, evo.ANY)) == 42)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(evo.ANY, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(evo.ANY, s1)) == 42)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(evo.ANY, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(evo.ANY, s2)) == 84)
|
||||||
|
|
||||||
|
assert(evo.has(e, evo.pair(evo.ANY, evo.ANY)))
|
||||||
|
assert(evo.get(e, evo.pair(evo.ANY, evo.ANY)) == 42)
|
||||||
|
end
|
||||||
|
end]]
|
||||||
|
|
||||||
|
--[[ wildcard setting
|
||||||
|
do
|
||||||
|
local p1, p2, s1, s2 = evo.id(4)
|
||||||
|
|
||||||
|
do
|
||||||
|
local e = evo.builder()
|
||||||
|
:set(evo.pair(p1, s1), 42)
|
||||||
|
:spawn()
|
||||||
|
|
||||||
|
evo.set(e, evo.pair(p1, s1), 84)
|
||||||
|
assert(evo.get(e, evo.pair(p1, s1)) == 84)
|
||||||
|
assert(evo.get(e, evo.pair(p1, s2)) == nil)
|
||||||
|
|
||||||
|
evo.set(e, evo.pair(p1, s2), 42)
|
||||||
|
assert(evo.get(e, evo.pair(p1, s1)) == 84)
|
||||||
|
assert(evo.get(e, evo.pair(p1, s2)) == 42)
|
||||||
|
|
||||||
|
evo.set(e, evo.pair(p1, evo.ANY), 21)
|
||||||
|
assert(evo.get(e, evo.pair(p1, s1)) == 21)
|
||||||
|
assert(evo.get(e, evo.pair(p1, s2)) == 21)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
|
do
|
||||||
|
local p1, s1, p2, s2 = evo.id(4)
|
||||||
|
|
||||||
|
do
|
||||||
|
local e = evo.builder()
|
||||||
|
:set(evo.pair(p1, s1), 42)
|
||||||
|
:set(evo.pair(p1, s2), 84)
|
||||||
|
:set(evo.pair(p2, s1), 21)
|
||||||
|
:set(evo.pair(p2, s2), 63)
|
||||||
|
:spawn()
|
||||||
|
|
||||||
|
evo.remove(e, evo.pair(p1, evo.ANY))
|
||||||
|
assert(not evo.has(e, evo.pair(p1, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(p1, s1)) == nil)
|
||||||
|
assert(not evo.has(e, evo.pair(p1, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(p1, s2)) == nil)
|
||||||
|
assert(evo.has(e, evo.pair(p2, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(p2, s1)) == 21)
|
||||||
|
assert(evo.has(e, evo.pair(p2, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(p2, s2)) == 63)
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local e = evo.builder()
|
||||||
|
:set(evo.pair(p1, s1), 42)
|
||||||
|
:set(evo.pair(p1, s2), 84)
|
||||||
|
:set(evo.pair(p2, s1), 21)
|
||||||
|
:set(evo.pair(p2, s2), 63)
|
||||||
|
:spawn()
|
||||||
|
|
||||||
|
evo.remove(e, evo.pair(evo.ANY, s2))
|
||||||
|
assert(evo.has(e, evo.pair(p1, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(p1, s1)) == 42)
|
||||||
|
assert(not evo.has(e, evo.pair(p1, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(p1, s2)) == nil)
|
||||||
|
assert(evo.has(e, evo.pair(p2, s1)))
|
||||||
|
assert(evo.get(e, evo.pair(p2, s1)) == 21)
|
||||||
|
assert(not evo.has(e, evo.pair(p2, s2)))
|
||||||
|
assert(evo.get(e, evo.pair(p2, s2)) == nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- TODO:
|
-- TODO:
|
||||||
-- How should required fragments work with pairs?
|
-- How should required fragments work with pairs?
|
||||||
-- How can we set defaults for paired fragments?
|
-- How can we set defaults for paired fragments?
|
||||||
|
|||||||
60
evolved.lua
60
evolved.lua
@@ -2049,7 +2049,7 @@ local function __chunk_required_fragments(chunk, req_fragment_set, req_fragment_
|
|||||||
fragment_stack[fragment_stack_size] = nil
|
fragment_stack[fragment_stack_size] = nil
|
||||||
fragment_stack_size = fragment_stack_size - 1
|
fragment_stack_size = fragment_stack_size - 1
|
||||||
|
|
||||||
if stack_fragment < 0 then
|
if __is_pair(stack_fragment) then
|
||||||
-- this is a pair fragment, just skip it
|
-- this is a pair fragment, just skip it
|
||||||
else
|
else
|
||||||
local fragment_requires = __sorted_requires[stack_fragment]
|
local fragment_requires = __sorted_requires[stack_fragment]
|
||||||
@@ -2067,7 +2067,7 @@ local function __chunk_required_fragments(chunk, req_fragment_set, req_fragment_
|
|||||||
req_fragment_set[required_fragment] = req_fragment_count
|
req_fragment_set[required_fragment] = req_fragment_count
|
||||||
req_fragment_list[req_fragment_count] = required_fragment
|
req_fragment_list[req_fragment_count] = required_fragment
|
||||||
|
|
||||||
if required_fragment < 0 then
|
if __is_pair(required_fragment) then
|
||||||
-- this is a pair fragment, just skip it
|
-- this is a pair fragment, just skip it
|
||||||
else
|
else
|
||||||
fragment_stack_size = fragment_stack_size + 1
|
fragment_stack_size = fragment_stack_size + 1
|
||||||
@@ -2104,7 +2104,7 @@ local function __fragment_required_fragments(fragment, req_fragment_set, req_fra
|
|||||||
fragment_stack[fragment_stack_size] = nil
|
fragment_stack[fragment_stack_size] = nil
|
||||||
fragment_stack_size = fragment_stack_size - 1
|
fragment_stack_size = fragment_stack_size - 1
|
||||||
|
|
||||||
if stack_fragment < 0 then
|
if __is_pair(stack_fragment) then
|
||||||
-- this is a pair fragment, just skip it
|
-- this is a pair fragment, just skip it
|
||||||
else
|
else
|
||||||
local fragment_requires = __sorted_requires[stack_fragment]
|
local fragment_requires = __sorted_requires[stack_fragment]
|
||||||
@@ -2122,7 +2122,7 @@ local function __fragment_required_fragments(fragment, req_fragment_set, req_fra
|
|||||||
req_fragment_set[required_fragment] = req_fragment_count
|
req_fragment_set[required_fragment] = req_fragment_count
|
||||||
req_fragment_list[req_fragment_count] = required_fragment
|
req_fragment_list[req_fragment_count] = required_fragment
|
||||||
|
|
||||||
if required_fragment < 0 then
|
if __is_pair(required_fragment) then
|
||||||
-- this is a pair fragment, just skip it
|
-- this is a pair fragment, just skip it
|
||||||
else
|
else
|
||||||
fragment_stack_size = fragment_stack_size + 1
|
fragment_stack_size = fragment_stack_size + 1
|
||||||
@@ -4504,15 +4504,24 @@ end
|
|||||||
---@return boolean
|
---@return boolean
|
||||||
---@nodiscard
|
---@nodiscard
|
||||||
function __evolved_alive(entity)
|
function __evolved_alive(entity)
|
||||||
if entity > 0 then
|
if not __is_pair(entity) then
|
||||||
local entity_index = entity % 0x100000
|
local entity_index = entity % 2 ^ 20
|
||||||
return __freelist_ids[entity_index] == entity
|
return __freelist_ids[entity_index] == entity
|
||||||
else
|
|
||||||
local primary_index = (0 - entity) % 0x100000
|
|
||||||
local secondary_index = (0 - entity - primary_index) / 0x100000
|
|
||||||
local primary, secondary = __freelist_ids[primary_index], __freelist_ids[secondary_index]
|
|
||||||
return primary % 0x100000 == primary_index and secondary % 0x100000 == secondary_index
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local primary_index, secondary_index = __evolved_unpack(entity)
|
||||||
|
|
||||||
|
local primary = __freelist_ids[primary_index]
|
||||||
|
if not primary or primary % 2 ^ 20 ~= primary_index then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local secondary = __freelist_ids[secondary_index]
|
||||||
|
if not secondary or secondary % 2 ^ 20 ~= secondary_index then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param ... evolved.entity entities
|
---@param ... evolved.entity entities
|
||||||
@@ -4561,13 +4570,18 @@ end
|
|||||||
---@return boolean
|
---@return boolean
|
||||||
---@nodiscard
|
---@nodiscard
|
||||||
function __evolved_empty(entity)
|
function __evolved_empty(entity)
|
||||||
if entity > 0 then
|
if __is_pair(entity) then
|
||||||
local entity_index = entity % 0x100000
|
|
||||||
return __freelist_ids[entity_index] ~= entity or not __entity_chunks[entity_index]
|
|
||||||
else
|
|
||||||
-- pairs are always empty
|
-- pairs are always empty
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local entity_index = entity % 2 ^ 20
|
||||||
|
|
||||||
|
if __freelist_ids[entity_index] ~= entity then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return not __entity_chunks[entity_index]
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param ... evolved.entity entities
|
---@param ... evolved.entity entities
|
||||||
@@ -4617,7 +4631,7 @@ end
|
|||||||
---@return boolean
|
---@return boolean
|
||||||
---@nodiscard
|
---@nodiscard
|
||||||
function __evolved_has(entity, fragment)
|
function __evolved_has(entity, fragment)
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs are always empty
|
-- pairs are always empty
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
@@ -4642,7 +4656,7 @@ end
|
|||||||
---@return boolean
|
---@return boolean
|
||||||
---@nodiscard
|
---@nodiscard
|
||||||
function __evolved_has_all(entity, ...)
|
function __evolved_has_all(entity, ...)
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs are always empty
|
-- pairs are always empty
|
||||||
return __lua_select('#', ...) == 0
|
return __lua_select('#', ...) == 0
|
||||||
end
|
end
|
||||||
@@ -4667,7 +4681,7 @@ end
|
|||||||
---@return boolean
|
---@return boolean
|
||||||
---@nodiscard
|
---@nodiscard
|
||||||
function __evolved_has_any(entity, ...)
|
function __evolved_has_any(entity, ...)
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs are always empty
|
-- pairs are always empty
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
@@ -4692,7 +4706,7 @@ end
|
|||||||
---@return evolved.component ... components
|
---@return evolved.component ... components
|
||||||
---@nodiscard
|
---@nodiscard
|
||||||
function __evolved_get(entity, ...)
|
function __evolved_get(entity, ...)
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs are always empty
|
-- pairs are always empty
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -4722,7 +4736,7 @@ function __evolved_set(entity, fragment, component)
|
|||||||
__debug_fns.validate_fragment(fragment)
|
__debug_fns.validate_fragment(fragment)
|
||||||
end
|
end
|
||||||
|
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
__error_fmt('the pair (%s) cannot have any fragments',
|
__error_fmt('the pair (%s) cannot have any fragments',
|
||||||
__id_name(entity))
|
__id_name(entity))
|
||||||
end
|
end
|
||||||
@@ -4963,7 +4977,7 @@ function __evolved_remove(entity, ...)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs cannot have fragments, nothing to remove
|
-- pairs cannot have fragments, nothing to remove
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -5086,7 +5100,7 @@ function __evolved_clear(...)
|
|||||||
local entity = __lua_select(argument_index, ...)
|
local entity = __lua_select(argument_index, ...)
|
||||||
local entity_index = entity % 0x100000
|
local entity_index = entity % 0x100000
|
||||||
|
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs cannot have fragments, nothing to clear
|
-- pairs cannot have fragments, nothing to clear
|
||||||
elseif __freelist_ids[entity_index] ~= entity then
|
elseif __freelist_ids[entity_index] ~= entity then
|
||||||
-- this entity is not alive, nothing to clear
|
-- this entity is not alive, nothing to clear
|
||||||
@@ -5162,7 +5176,7 @@ function __evolved_destroy(...)
|
|||||||
local entity = __lua_select(argument_index, ...)
|
local entity = __lua_select(argument_index, ...)
|
||||||
local entity_index = entity % 0x100000
|
local entity_index = entity % 0x100000
|
||||||
|
|
||||||
if entity < 0 then
|
if __is_pair(entity) then
|
||||||
-- pairs cannot be destroyed, nothing to do
|
-- pairs cannot be destroyed, nothing to do
|
||||||
elseif __freelist_ids[entity_index] ~= entity then
|
elseif __freelist_ids[entity_index] ~= entity then
|
||||||
-- this entity is not alive, nothing to destroy
|
-- this entity is not alive, nothing to destroy
|
||||||
|
|||||||
Reference in New Issue
Block a user