diff --git a/packages/ludic.wildlife/index.ludic b/packages/ludic.wildlife/index.ludic index a7499956..0a65d1ed 100644 --- a/packages/ludic.wildlife/index.ludic +++ b/packages/ludic.wildlife/index.ludic @@ -10,6 +10,7 @@ import "port.ludic" import "facts.ludic" import "table.ludic" import "store.ludic" +import "near.ludic" import "guest.ludic" import "record.ludic" import "habitat.ludic" diff --git a/packages/ludic.wildlife/near.ludic b/packages/ludic.wildlife/near.ludic new file mode 100644 index 00000000..ffc71f5a --- /dev/null +++ b/packages/ludic.wildlife/near.ludic @@ -0,0 +1,15 @@ +# near.ludic - the animals around a point, living ones only, into a list the CALLER keeps (in its own +# state, reused every frame): from the grid, or a species' own list when it is rare. Nothing is +# allocated or written here. +export function wildlife_near(wildlife_st: WildlifeState, x: float, z: float, r: float, out: []WildAnimal) -> int { + let w = wildlife_st.wl + return tb_within_recs(w.tab, w.grid, x, z, r, -1, 0, out) +} + +export function wildlife_near_of(wildlife_st: WildlifeState, sp: int, x: float, z: float, r: float, out: []WildAnimal) -> int { + let w = wildlife_st.wl + return tb_within_of_recs(w.tab, w.grid, w.species, x, z, r, sp, out) +} + +# how many of a species are alive, legends included, without a walk +export function wildlife_alive_of(wildlife_st: WildlifeState, sp: int) -> int { return ix_count(wildlife_st.wl.species, sp) } diff --git a/packages/ludic.wildlife/tests/wildlife_test.ludic b/packages/ludic.wildlife/tests/wildlife_test.ludic index 6c393fae..840d0921 100644 --- a/packages/ludic.wildlife/tests/wildlife_test.ludic +++ b/packages/ludic.wildlife/tests/wildlife_test.ludic @@ -243,6 +243,10 @@ program WildlifeTest { expect_eq(wildlife_count(wildlife_st, 1), 0) expect(wildlife_nearest(wildlife_st, -1, 0.0, 0.0, 0.0) == a) expect(wildlife_nearest(wildlife_st, 1, 0.0, 0.0, 0.0) == c) + let near = new []WildAnimal + expect_eq(wildlife_near(wildlife_st, 0.0, 0.0, 40.0, near), 2) + expect_eq(wildlife_near_of(wildlife_st, 0, 0.0, 0.0, 200.0, near), 2) + expect_eq(wildlife_alive_of(wildlife_st, 1), 1) wildlife_remove(a) expect_eq(wildlife_count(wildlife_st, 0), 1) expect(wildlife_nearest(wildlife_st, 0, 0.0, 0.0, 0.0) == b)