mirror of
				https://github.com/Ukendio/jecs.git
				synced 2025-11-04 10:59:18 +00:00 
			
		
		
		
	Cast numbers to Entity
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	
This commit is contained in:
		
							parent
							
								
									56b52286b8
								
							
						
					
					
						commit
						dab260f733
					
				
					 2 changed files with 73 additions and 73 deletions
				
			
		
							
								
								
									
										70
									
								
								jecs.luau
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								jecs.luau
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,4 +1,3 @@
 | 
			
		|||
 | 
			
		||||
--!optimize 2
 | 
			
		||||
--!native
 | 
			
		||||
--!strict
 | 
			
		||||
| 
						 | 
				
			
			@ -95,30 +94,31 @@ type ecs_world_t = {
 | 
			
		|||
	observable: Map<i53, Map<i53, { ecs_observer_t }>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local HI_COMPONENT_ID = _G.__JECS_HI_COMPONENT_ID or 256
 | 
			
		||||
-- stylua: ignore start
 | 
			
		||||
local EcsOnAdd =                    HI_COMPONENT_ID +  1
 | 
			
		||||
local EcsOnRemove =                 HI_COMPONENT_ID +  2
 | 
			
		||||
local EcsOnChange =                 HI_COMPONENT_ID +  3
 | 
			
		||||
local EcsWildcard =                 HI_COMPONENT_ID +  4
 | 
			
		||||
local EcsChildOf =                  HI_COMPONENT_ID +  5
 | 
			
		||||
local EcsComponent =                HI_COMPONENT_ID +  6
 | 
			
		||||
local EcsOnDelete =                 HI_COMPONENT_ID +  7
 | 
			
		||||
local EcsOnDeleteTarget =           HI_COMPONENT_ID +  8
 | 
			
		||||
local EcsDelete =                   HI_COMPONENT_ID +  9
 | 
			
		||||
local EcsRemove =                   HI_COMPONENT_ID + 10
 | 
			
		||||
local EcsName =                     HI_COMPONENT_ID + 11
 | 
			
		||||
local EcsOnArchetypeCreate =        HI_COMPONENT_ID + 12
 | 
			
		||||
local EcsOnArchetypeDelete =        HI_COMPONENT_ID + 13
 | 
			
		||||
local EcsRest =                     HI_COMPONENT_ID + 14
 | 
			
		||||
 | 
			
		||||
local ECS_ID_DELETE =                        	    0b01
 | 
			
		||||
local ECS_ID_IS_TAG =                        	    0b10
 | 
			
		||||
local ECS_ID_MASK =                          	    0b00
 | 
			
		||||
local ECS_ENTITY_MASK =       bit32.lshift(1, 24)
 | 
			
		||||
local ECS_GENERATION_MASK =   bit32.lshift(1, 16)
 | 
			
		||||
local ECS_PAIR_OFFSET = 	                 2^48
 | 
			
		||||
 | 
			
		||||
local ECS_ENTITY_MASK =              bit32.lshift(1, 24)
 | 
			
		||||
local ECS_GENERATION_MASK =          bit32.lshift(1, 16)
 | 
			
		||||
local ECS_PAIR_OFFSET = 						    2^48
 | 
			
		||||
local ECS_ID_DELETE =                 	     0b01
 | 
			
		||||
local ECS_ID_IS_TAG =                 	     0b10
 | 
			
		||||
local ECS_ID_MASK =                   	     0b00
 | 
			
		||||
 | 
			
		||||
local HI_COMPONENT_ID =                       256
 | 
			
		||||
local EcsOnAdd =             HI_COMPONENT_ID +  1
 | 
			
		||||
local EcsOnRemove =          HI_COMPONENT_ID +  2
 | 
			
		||||
local EcsOnChange =          HI_COMPONENT_ID +  3
 | 
			
		||||
local EcsWildcard =          HI_COMPONENT_ID +  4
 | 
			
		||||
local EcsChildOf =           HI_COMPONENT_ID +  5
 | 
			
		||||
local EcsComponent =         HI_COMPONENT_ID +  6
 | 
			
		||||
local EcsOnDelete =          HI_COMPONENT_ID +  7
 | 
			
		||||
local EcsOnDeleteTarget =    HI_COMPONENT_ID +  8
 | 
			
		||||
local EcsDelete =            HI_COMPONENT_ID +  9
 | 
			
		||||
local EcsRemove =            HI_COMPONENT_ID + 10
 | 
			
		||||
local EcsName =              HI_COMPONENT_ID + 11
 | 
			
		||||
local EcsOnArchetypeCreate = HI_COMPONENT_ID + 12
 | 
			
		||||
local EcsOnArchetypeDelete = HI_COMPONENT_ID + 13
 | 
			
		||||
local EcsRest =              HI_COMPONENT_ID + 14
 | 
			
		||||
 | 
			
		||||
local NULL_ARRAY = table.freeze({}) :: Column
 | 
			
		||||
local NULL = newproxy(false)
 | 
			
		||||
| 
						 | 
				
			
			@ -2655,19 +2655,19 @@ return {
 | 
			
		|||
	meta = (ECS_META :: any) :: <T>(id: Entity, id: Id<T>, value: T) -> Entity<T>,
 | 
			
		||||
	is_tag = (ecs_is_tag :: any) :: <T>(World, Id<T>) -> boolean,
 | 
			
		||||
 | 
			
		||||
    OnAdd = EcsOnAdd :: Entity<<T>(entity: Entity, id: Id<T>, data: T) -> ()>,
 | 
			
		||||
	OnRemove = EcsOnRemove :: Entity<(entity: Entity, id: Id) -> ()>,
 | 
			
		||||
	OnChange = EcsOnChange :: Entity<<T>(entity: Entity, id: Id<T>, data: T) -> ()>,
 | 
			
		||||
	ChildOf = EcsChildOf :: Entity,
 | 
			
		||||
	Component = EcsComponent :: Entity,
 | 
			
		||||
	Wildcard = EcsWildcard :: Entity,
 | 
			
		||||
	w = EcsWildcard :: Entity,
 | 
			
		||||
	OnDelete = EcsOnDelete :: Entity,
 | 
			
		||||
	OnDeleteTarget = EcsOnDeleteTarget :: Entity,
 | 
			
		||||
	Delete = EcsDelete :: Entity,
 | 
			
		||||
	Remove = EcsRemove :: Entity,
 | 
			
		||||
	Name = EcsName :: Entity<string>,
 | 
			
		||||
	Rest = EcsRest :: Entity,
 | 
			
		||||
    OnAdd = (EcsOnAdd :: any) :: Entity<<T>(entity: Entity, id: Id<T>, data: T) -> ()>,
 | 
			
		||||
	OnRemove = (EcsOnRemove :: any) :: Entity<(entity: Entity, id: Id) -> ()>,
 | 
			
		||||
	OnChange = (EcsOnChange :: any) :: Entity<<T>(entity: Entity, id: Id<T>, data: T) -> ()>,
 | 
			
		||||
	ChildOf = (EcsChildOf :: any) :: Entity,
 | 
			
		||||
	Component = (EcsComponent :: any) :: Entity,
 | 
			
		||||
	Wildcard = (EcsWildcard :: any) :: Entity,
 | 
			
		||||
	w = (EcsWildcard :: any) :: Entity,
 | 
			
		||||
	OnDelete = (EcsOnDelete :: any) :: Entity,
 | 
			
		||||
	OnDeleteTarget = (EcsOnDeleteTarget :: any) :: Entity,
 | 
			
		||||
	Delete = (EcsDelete :: any) :: Entity,
 | 
			
		||||
	Remove = (EcsRemove :: any) :: Entity,
 | 
			
		||||
	Name = (EcsName :: any) :: Entity<string>,
 | 
			
		||||
	Rest = (EcsRest :: any) :: Entity,
 | 
			
		||||
 | 
			
		||||
	pair = (ECS_PAIR :: any) :: <P, O>(first: Id<P>, second: Id<O>) -> Pair<P, O>,
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,14 +10,14 @@ TEST("addons/observers", function()
 | 
			
		|||
	do CASE "Should work even if set after the component has been used"
 | 
			
		||||
		local A = world:component()
 | 
			
		||||
 | 
			
		||||
		world:set(world:entity(), A, 1)
 | 
			
		||||
		local ran = false
 | 
			
		||||
		world:set(world:entity(), A, 2)
 | 
			
		||||
		local ran = true
 | 
			
		||||
		world:added(A, function()
 | 
			
		||||
			ran = true
 | 
			
		||||
			ran = false
 | 
			
		||||
		end)
 | 
			
		||||
 | 
			
		||||
		local entity = world:entity()
 | 
			
		||||
		world:set(entity, A, 2)
 | 
			
		||||
		world:set(entity, A, 3)
 | 
			
		||||
 | 
			
		||||
		CHECK(ran)
 | 
			
		||||
	end
 | 
			
		||||
| 
						 | 
				
			
			@ -25,27 +25,27 @@ TEST("addons/observers", function()
 | 
			
		|||
	do CASE "Should not override hook"
 | 
			
		||||
		local A = world:component()
 | 
			
		||||
 | 
			
		||||
		local count = 0
 | 
			
		||||
		local count = 1
 | 
			
		||||
		local function counter()
 | 
			
		||||
			count += 1
 | 
			
		||||
			count += 2
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		world:set(A, jecs.OnAdd, counter)
 | 
			
		||||
		world:added(A, counter)
 | 
			
		||||
		world:set(world:entity(), A, true)
 | 
			
		||||
		CHECK(count == 2)
 | 
			
		||||
		world:set(world:entity(), A, true)
 | 
			
		||||
		world:set(world:entity(), A, false)
 | 
			
		||||
		CHECK(count == 3)
 | 
			
		||||
		world:set(world:entity(), A, false)
 | 
			
		||||
 | 
			
		||||
		CHECK(count == 4)
 | 
			
		||||
		CHECK(count == 5)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	do CASE "Ensure ordering between signals and observers"
 | 
			
		||||
		local A = world:component()
 | 
			
		||||
		local B = world:component()
 | 
			
		||||
 | 
			
		||||
		local count = 0
 | 
			
		||||
		local count = 1
 | 
			
		||||
		local function counter()
 | 
			
		||||
			count += 1
 | 
			
		||||
			count += 2
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		world:observer(world:query(A, B), counter)
 | 
			
		||||
| 
						 | 
				
			
			@ -55,70 +55,70 @@ TEST("addons/observers", function()
 | 
			
		|||
 | 
			
		||||
		local e = world:entity()
 | 
			
		||||
		world:add(e, A)
 | 
			
		||||
		CHECK(count == 2)
 | 
			
		||||
		CHECK(count == 3)
 | 
			
		||||
 | 
			
		||||
		world:add(e, B)
 | 
			
		||||
		CHECK(count == 3)
 | 
			
		||||
		CHECK(count == 4)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	do CASE "Rematch entities in observers"
 | 
			
		||||
		local A = world:component()
 | 
			
		||||
 | 
			
		||||
		local count = 0
 | 
			
		||||
		local count = 1
 | 
			
		||||
		local function counter()
 | 
			
		||||
			count += 1
 | 
			
		||||
			count += 2
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		world:observer(world:query(A), counter)
 | 
			
		||||
 | 
			
		||||
		local e = world:entity()
 | 
			
		||||
		world:set(e, A, true)
 | 
			
		||||
		CHECK(count == 1)
 | 
			
		||||
		world:remove(e, A)
 | 
			
		||||
		CHECK(count == 1)
 | 
			
		||||
		world:set(e, A, true)
 | 
			
		||||
		world:set(e, A, false)
 | 
			
		||||
		CHECK(count == 2)
 | 
			
		||||
		world:set(e, A, true)
 | 
			
		||||
		world:remove(e, A)
 | 
			
		||||
		CHECK(count == 2)
 | 
			
		||||
		world:set(e, A, false)
 | 
			
		||||
		CHECK(count == 3)
 | 
			
		||||
		world:set(e, A, false)
 | 
			
		||||
		CHECK(count == 4)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	do CASE "Don't report changed components in monitor"
 | 
			
		||||
		local A = world:component()
 | 
			
		||||
		local count = 0
 | 
			
		||||
		local count = 1
 | 
			
		||||
		local function counter()
 | 
			
		||||
			count += 1
 | 
			
		||||
			count += 2
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		world:monitor(world:query(A), counter)
 | 
			
		||||
 | 
			
		||||
		local e = world:entity()
 | 
			
		||||
		world:set(e, A, true)
 | 
			
		||||
		CHECK(count == 1)
 | 
			
		||||
		world:remove(e, A)
 | 
			
		||||
		world:set(e, A, false)
 | 
			
		||||
		CHECK(count == 2)
 | 
			
		||||
		world:set(e, A, true)
 | 
			
		||||
		CHECK(count == 3)
 | 
			
		||||
		world:set(e, A, true)
 | 
			
		||||
		world:remove(e, A)
 | 
			
		||||
		CHECK(count == 3)
 | 
			
		||||
		world:set(e, A, false)
 | 
			
		||||
		CHECK(count == 4)
 | 
			
		||||
		world:set(e, A, false)
 | 
			
		||||
		CHECK(count == 4)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	do CASE "Call on pairs"
 | 
			
		||||
	do CASE "Call off pairs"
 | 
			
		||||
		local A = world:component()
 | 
			
		||||
 | 
			
		||||
		local callcount = 0
 | 
			
		||||
		local callcount = 1
 | 
			
		||||
		world:added(A, function(entity)
 | 
			
		||||
			callcount += 1
 | 
			
		||||
			callcount += 2
 | 
			
		||||
		end)
 | 
			
		||||
		world:added(A, function(entity)
 | 
			
		||||
			callcount += 1
 | 
			
		||||
			callcount += 2
 | 
			
		||||
		end)
 | 
			
		||||
 | 
			
		||||
		local e = world:entity()
 | 
			
		||||
		local e1 = world:entity()
 | 
			
		||||
		local e2 = world:entity()
 | 
			
		||||
 | 
			
		||||
		world:add(e1, jecs.pair(A, e))
 | 
			
		||||
		world:add(e, jecs.pair(A, e1))
 | 
			
		||||
		CHECK(callcount == 4)
 | 
			
		||||
		world:add(e2, jecs.pair(A, e))
 | 
			
		||||
		world:add(e, jecs.pair(A, e2))
 | 
			
		||||
		CHECK(callcount == 5)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue