diff --git a/jecs.luau b/jecs.luau index 6822856..1dea181 100644 --- a/jecs.luau +++ b/jecs.luau @@ -1651,7 +1651,7 @@ local function query_cached(query: QueryInner) i = #entities entityId = entities[i] columns = archetype.columns - local records = archetype.records + records = archetype.records a = columns[records[A].column] b = columns[records[B].column] end @@ -1675,7 +1675,7 @@ local function query_cached(query: QueryInner) i = #entities entityId = entities[i] columns = archetype.columns - local records = archetype.records + records = archetype.records a = columns[records[A].column] b = columns[records[B].column] c = columns[records[C].column] @@ -1700,7 +1700,7 @@ local function query_cached(query: QueryInner) i = #entities entityId = entities[i] columns = archetype.columns - local records = archetype.records + records = archetype.records a = columns[records[A].column] b = columns[records[B].column] c = columns[records[C].column] @@ -1727,7 +1727,7 @@ local function query_cached(query: QueryInner) i = #entities entityId = entities[i] columns = archetype.columns - local records = archetype.records + records = archetype.records if not F then a = columns[records[A].column] @@ -2142,16 +2142,26 @@ function World.new() return self end -export type Id = Entity +type Id = + | (number & { __jecs_pair_value: T }) + | (number & { __T: T }) -type function ecs_entity_t(entity) - return entity:components()[2]:readproperty(types.singleton("__T")) +export type Pair

= number & { + __jecs_pair_value: ecs_id_t> +} + +type function ecs_id_t(entity) + local ty = entity:components()[2] + local __T = ty:readproperty(types.singleton("__T")) + if not __T then + return ty:readproperty(types.singleton("__jecs_pair_value")) + end + return __T end -type function Pair(first, second) - local thing = first:components()[2] - - if thing:readproperty(types.singleton("__T")):is("nil") then +type function ecs_pair_t(first, second) + local ty = first:components()[2] + if ty:readproperty(types.singleton("__T")):is("nil") then return second else return first @@ -2160,7 +2170,7 @@ end type Item = (self: Query) -> (Entity, T...) -export type Entity = number & { __T: T } +export type Entity = number & { __T: T } type Iter = (query: Query) -> () -> (Entity, T...) @@ -2250,14 +2260,14 @@ export type World = { children: (self: World, id: Id) -> () -> Entity, --- Searches the world for entities that match a given query - query: ((World, A) -> Query>) - & ((World, A, B) -> Query, ecs_entity_t>) - & ((World, A, B, C) -> Query, ecs_entity_t, ecs_entity_t>) - & ((World, A, B, C, D) -> Query, ecs_entity_t, ecs_entity_t, ecs_entity_t>) - & ((World, A, B, C, D, E) -> Query, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t>) - & ((World, A, B, C, D, E, F) -> Query, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t>) - & ((World, A, B, C, D, E, F, G) -> Query, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t>) - & ((World, A, B, C, D, E, F, G, H) -> Query, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t, ecs_entity_t>) + query: ((World, A) -> Query>) + & ((World, A, B) -> Query, ecs_id_t>) + & ((World, A, B, C) -> Query, ecs_id_t, ecs_id_t>) + & ((World, A, B, C, D) -> Query, ecs_id_t, ecs_id_t, ecs_id_t>) + & ((World, A, B, C, D, E) -> Query, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t>) + & ((World, A, B, C, D, E, F) -> Query, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t>) + & ((World, A, B, C, D, E, F, G) -> Query, ecs_id_t, ecs_entity_t, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t>) + & ((World, A, B, C, D, E, F, G, H) -> Query, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t, ecs_id_t>) } return {