From 7dc7ac56bbc5cf596abcccecfac86e77bdcfb8a1 Mon Sep 17 00:00:00 2001 From: Niki Date: Sat, 19 Apr 2025 18:12:23 +0200 Subject: [PATCH] tower: cache paths in range --- src/tdef/tower.c | 13 ++++++------- src/tdef/tower.h | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tdef/tower.c b/src/tdef/tower.c index 4249314..a8e0973 100644 --- a/src/tdef/tower.c +++ b/src/tdef/tower.c @@ -57,6 +57,7 @@ int init_tower(tower_t *self, tower_base_t *base, int id, int x, int y) { self->target = TARGET_FIRST; self->super = 0; self->fire_delayed = 0; + self->cached_paths = NULL; init_proj_desc(&self->projectile); @@ -72,6 +73,7 @@ void free_tower(tower_t *self) { void uninit_tower(tower_t *self) { self->CNAME[0] = '!'; + free_array(self->cached_paths); } int init_tower_base(tower_base_t *self, int type) { @@ -160,14 +162,12 @@ path_t *get_target(tower_t *self, array_t *enemies, array_t *paths) { enemy_t *e_target = NULL; path_t *p_target = NULL; - // TODO: move paths_in_range as a member of tower_t, cache it + if (!self->cached_paths) + self->cached_paths = paths_in_range(self, paths); array_t *e_in_range = enemies_in_range(self, paths, enemies); - array_t *p_in_range = (e_in_range->count) ? - paths_in_range(self, paths) - : new_array(sizeof(enemy_t*), 1); - if (e_in_range->count && p_in_range->count) - array_loop (p_in_range, pptr, path_t*) { + if (e_in_range->count && self->cached_paths->count) + array_loop (self->cached_paths, pptr, path_t*) { path_t *p = *pptr; int proj_at_p_in = when(p, self->x, self->y, self->proj_speed); @@ -212,7 +212,6 @@ path_t *get_target(tower_t *self, array_t *enemies, array_t *paths) { } } - free_array(p_in_range); free_array(e_in_range); return p_target; diff --git a/src/tdef/tower.h b/src/tdef/tower.h index b901bad..7f490ee 100644 --- a/src/tdef/tower.h +++ b/src/tdef/tower.h @@ -58,6 +58,7 @@ typedef struct { int fire_delayed; // in ticks still to wait int cost; // total *resell* cost in bits (all upgrades included) proj_desc_t projectile; + array_t *cached_paths; // cache for paths in range } tower_t; /** -- 2.27.0