diff --git a/jecs.luau b/jecs.luau index 798052b..e5faf96 100644 --- a/jecs.luau +++ b/jecs.luau @@ -1,4 +1,3 @@ - --!optimize 2 --!native --!strict @@ -95,30 +94,31 @@ type ecs_world_t = { observable: Map>, } -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) :: (id: Entity, id: Id, value: T) -> Entity, is_tag = (ecs_is_tag :: any) :: (World, Id) -> boolean, - OnAdd = EcsOnAdd :: Entity<(entity: Entity, id: Id, data: T) -> ()>, - OnRemove = EcsOnRemove :: Entity<(entity: Entity, id: Id) -> ()>, - OnChange = EcsOnChange :: Entity<(entity: Entity, id: Id, 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, - Rest = EcsRest :: Entity, + OnAdd = (EcsOnAdd :: any) :: Entity<(entity: Entity, id: Id, data: T) -> ()>, + OnRemove = (EcsOnRemove :: any) :: Entity<(entity: Entity, id: Id) -> ()>, + OnChange = (EcsOnChange :: any) :: Entity<(entity: Entity, id: Id, 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, + Rest = (EcsRest :: any) :: Entity, pair = (ECS_PAIR :: any) :: (first: Id

, second: Id) -> Pair, diff --git a/test/addons/observers.luau b/test/addons/observers.luau index 537ce60..0a363cc 100644 --- a/test/addons/observers.luau +++ b/test/addons/observers.luau @@ -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)