work on events and alive mgmt
authorNiki <niki@nikiroo.be>
Tue, 8 Apr 2025 15:14:08 +0000 (17:14 +0200)
committerNiki <niki@nikiroo.be>
Tue, 8 Apr 2025 15:14:08 +0000 (17:14 +0200)
src/cutils
src/tdef/map.c
src/tdef/map.h
src/tdef/tdef.c

index c90622df7e4c032152641693b39364a2864abba9..7c14139e06ca318936241c1e22d0a469237bf4bf 160000 (submodule)
@@ -1 +1 @@
-Subproject commit c90622df7e4c032152641693b39364a2864abba9
+Subproject commit 7c14139e06ca318936241c1e22d0a469237bf4bf
index 5bb3a34cd2b49f4707181fc756495455dbb0577f..598466823c3c2afa7a3d3d878097f495d849045f 100644 (file)
@@ -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);
        }
 }
 
index 16899f6165714726e6ee5e113b77309739089452..de4e544fbdab848a06a80ebfc83eae51f7de2014 100644 (file)
@@ -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;
 
 /**
index edfce3b632e96f83e2f12b64090a2e2733569d14..fc6bd6ad28801ad5d682e4cc8461a92c39699a71 100644 (file)
@@ -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;