tower: cache paths in range
authorNiki <niki@nikiroo.be>
Sat, 19 Apr 2025 16:12:23 +0000 (18:12 +0200)
committerNiki <niki@nikiroo.be>
Sat, 19 Apr 2025 16:12:23 +0000 (18:12 +0200)
src/tdef/tower.c
src/tdef/tower.h

index 4249314384d4acf5a7938af088b57560e1ee594d..a8e0973fee8ad6152b650f39b0496acb9cbdd883 100644 (file)
@@ -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;
index b901badf0ea0018a2d9b9c97e58759a750054d06..7f490ee11c462792739c26e7f759ef11e03b5112 100644 (file)
@@ -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;
 
 /**