From: Niki Date: Tue, 8 Apr 2025 15:14:08 +0000 (+0200) Subject: work on events and alive mgmt X-Git-Url: http://git.nikiroo.be/?a=commitdiff_plain;h=49c58b446b0ee11a7ca6a169175beaa8badbbfcb;p=tdef.git work on events and alive mgmt --- diff --git a/src/cutils b/src/cutils index c90622d..7c14139 160000 --- a/src/cutils +++ b/src/cutils @@ -1 +1 @@ -Subproject commit c90622df7e4c032152641693b39364a2864abba9 +Subproject commit 7c14139e06ca318936241c1e22d0a469237bf4bf diff --git a/src/tdef/map.c b/src/tdef/map.c index 5bb3a34..5984668 100644 --- a/src/tdef/map.c +++ b/src/tdef/map.c @@ -53,11 +53,12 @@ int init_map(map_t *self, int width, int height) { self->alive = new_array(sizeof(enemy_t*), 10); self->breached = new_array(sizeof(enemy_t*), 20); self->backfill = new_array(sizeof(enemy_t*), 10); + self->tmp_e = new_array(sizeof(enemy_t*), 10); - self->projs = new_proj(-1, -1); + self->projs = new_proj(-1, -1); // fake item, HEAD - if (!self->data || !self->paths || !self->towers - || !self->alive || !self->breached || !self->backfill) { + if (!self->data || !self->paths || !self->towers || !self->alive + || !self->breached || !self->backfill || !self->tmp_e){ uninit_map(self); return 0; } @@ -87,6 +88,7 @@ void uninit_map(map_t *self) { free_array(self->alive ); self->alive = NULL; free_array(self->breached); self->breached = NULL; free_array(self->backfill); self->backfill = NULL; + free_array(self->tmp_e ); self->tmp_e = NULL; while (self->projs) { proj_t *p = self->projs; @@ -108,7 +110,6 @@ void map_enemy_enters(map_t *self, enemy_t *enemy, array_t *events) { void map_move_1(map_t *self, array_t *events) { int dead = 0; - array_deloop(self->alive, ptr, enemy_t*) { enemy_t *alive = *ptr; if (alive->alive) @@ -117,15 +118,13 @@ void map_move_1(map_t *self, array_t *events) { dead++; } - if (dead > self->alive->count) { - dead = 0; - array_deloop(self->alive, ptr, enemy_t*) { + if (dead > (self->alive->count / 2)) { + array_clear(self->tmp_e); + array_loop(self->alive, ptr, enemy_t*) { if((*ptr)->alive) - break; - dead++; + array_push(self->tmp_e, ptr); } - - array_cut_at(self->alive, self->alive->count - dead); + array_steal_data(self->alive, self->tmp_e); } if (self->backfill->count) { @@ -136,14 +135,24 @@ void map_move_1(map_t *self, array_t *events) { } void map_fire_1(map_t *self, int current_tick, array_t *events) { + event_t event; + init_event(&event, FIRE); + array_loop(self->towers, tower, tower_t) { tower_rearm(tower); proj_t *target = tower_fire(tower, current_tick, self->alive, self->paths); if (!target) continue; + target->next = self->projs->next; self->projs->next = target; + + event.x = tower->x; + event.y = tower->y; + event.move_to_x = target->x; + event.move_to_y = target->y; + array_push(events, &event); } } diff --git a/src/tdef/map.h b/src/tdef/map.h index 16899f6..de4e544 100644 --- a/src/tdef/map.h +++ b/src/tdef/map.h @@ -32,6 +32,7 @@ typedef struct { array_t *breached; // enemy* array_t *backfill; // enemy* proj_t *projs; // first one is fake (list head) + array_t *tmp_e; // enemy* } map_t; /** diff --git a/src/tdef/tdef.c b/src/tdef/tdef.c index edfce3b..fc6bd6a 100644 --- a/src/tdef/tdef.c +++ b/src/tdef/tdef.c @@ -59,29 +59,23 @@ void display(map_t *self) { fprintf(stderr, "\n"); } -void display_event(event_t *self) { +void output_event(event_t *self, FILE *file) { const char *name = event_name(self); switch (self->type) { case FIRE: case HIT: case MOVE: - fprintf(stderr, "[*] %s: (%d,%d) -> (%d,%d)\n", name, + fprintf(file, "EVENT:%s,%d,%d,%d,%d\n", name, self->x, self->y, self->move_to_x, self->move_to_y); break; case BACKFILL: case DIE: case BREACH: - fprintf(stderr, "[*] %s: (%d,%d)\n", name, self->x, self->y); + fprintf(file, "EVENT:%s,%d,%d\n", name, self->x, self->y); break; case ENTER: case WIN: case LOOSE: - fprintf(stderr, "[*] %s\n", name); + fprintf(file, "EVENT:%s\n", name); break; } } -void output_event(event_t *self, FILE *file) { - const char *name = event_name(self); - fwrite(name, 1, strlen(name), file); - fwrite("\n",1, 1, file); -} - int main(int argc, char **argv) { map_t *map = new_map(6, 4); if (!map) { @@ -124,9 +118,6 @@ int main(int argc, char **argv) { if (displayMode) { fprintf(stderr, "Tick is: %d\n", engine->current_tick); - array_loop(engine->events, event, event_t) { - display_event(event); - } display(map); } break;