From 16e805598358a6ce58fafac782f63efa77ec0315 Mon Sep 17 00:00:00 2001 From: EncodedVenom <32179912+EncodedVenom@users.noreply.github.com> Date: Mon, 23 Sep 2024 08:29:53 -0400 Subject: [PATCH] Allow nil indexing in world:target (#131) * Allow nil index in world:target * Fix the fun type at the bottom * Update tests --- src/index.d.ts | 10 ++++++++++ src/init.luau | 5 +++-- test/tests.luau | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index 8dbbc72..6d62f68 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -95,11 +95,21 @@ export class World { * Gets the target of a relationship. For example, when a user calls * `world.target(entity, ChildOf(parent))`, you will obtain the parent entity. * @param entity Entity + * @param index Target index * @param relation The Relationship * @returns The Parent Entity if it exists */ target(entity: Entity, relation: Entity, index: number): Entity | undefined; + /** + * Gets the target of a relationship. For example, when a user calls + * `world.target(entity, ChildOf(parent))`, you will obtain the parent entity. + * @param entity Entity + * @param relation The Relationship + * @returns The Parent Entity if it exists + */ + target(entity: Entity, relation: Entity): Entity | undefined; + /** * Clears an entity from the world. * @param entity Entity to be cleared diff --git a/src/init.luau b/src/init.luau index ef8c6b5..b8154ec 100644 --- a/src/init.luau +++ b/src/init.luau @@ -389,7 +389,8 @@ local function world_has(world: World, entity: number, ...: i53): boolean return true end -local function world_target(world: World, entity: i53, relation: i24, index: number): i24? +local function world_target(world: World, entity: i53, relation: i24, index_opt: number?): i24? + local index = if index_opt then index_opt else 0 local record = world.entityIndex.sparse[entity] local archetype = record.archetype if not archetype then @@ -1812,7 +1813,7 @@ export type World = { component: (self: World) -> Entity, --- Gets the target of an relationship. For example, when a user calls --- `world:target(id, ChildOf(parent), 0)`, you will obtain the parent entity. - target: (self: World, id: Entity, relation: Entity, nth: number) -> Entity?, + target: (self: World, id: Entity, relation: Entity, nth: number?) -> Entity?, --- Deletes an entity and all it's related components and relationships. delete: (self: World, id: Entity) -> (), diff --git a/test/tests.luau b/test/tests.luau index 503ebd8..c708a6e 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1012,6 +1012,25 @@ TEST("world:target", function() CHECK(world:target(e, C, 1) == nil) end + do CASE "infer index when unspecified" + local world = world_new() + local A = world:component() + local B = world:component() + local C = world:component() + local D = world:component() + local e = world:entity() + + world:add(e, pair(A, B)) + world:add(e, pair(A, C)) + world:add(e, pair(B, C)) + world:add(e, pair(B, D)) + world:add(e, pair(C, D)) + + CHECK(world:target(e, A) == world:target(e, A, 0)) + CHECK(world:target(e, B) == world:target(e, B, 0)) + CHECK(world:target(e, C) == world:target(e, C, 0)) + end + do CASE "loop until no target" local world = world_new()