From 7ceefa8c50503f033b8a467b09f890fd75814f75 Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Sun, 27 Sep 2026 21:54:39 +0300 Subject: [PATCH] feat(ecs): wildlife_near / wildlife_near_of into the caller's list, wildlife_alive_of The living animals around a point from the grid (a rare species from its own list), into a list the caller keeps in its own state, so a frame's proximity question walks the cells it covers rather than every animal ever made. wildlife_alive_of is the species index's count. Co-Authored-By: Claude Opus 5.5 --- packages/ludic.wildlife/index.ludic | 1 + packages/ludic.wildlife/near.ludic | 15 +++++++++++++++ packages/ludic.wildlife/tests/wildlife_test.ludic | 4 ++++ 3 files changed, 20 insertions(+) create mode 100644 packages/ludic.wildlife/near.ludic 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)