self->target = TARGET_FIRST;
self->super = 0;
self->fire_delayed = 0;
+ self->cached_paths = NULL;
init_proj_desc(&self->projectile);
void uninit_tower(tower_t *self) {
self->CNAME[0] = '!';
+ free_array(self->cached_paths);
}
int init_tower_base(tower_base_t *self, int type) {
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);
}
}
- free_array(p_in_range);
free_array(e_in_range);
return p_target;