some work on engine
authorNiki <niki@nikiroo.be>
Sat, 5 Apr 2025 08:34:03 +0000 (10:34 +0200)
committerNiki <niki@nikiroo.be>
Sat, 5 Apr 2025 08:34:03 +0000 (10:34 +0200)
src/cutils
src/tdef/enemy.c
src/tdef/enemy.h
src/tdef/engine.c
src/tdef/tdef.c

index d6fa07c12023662e16ace68bba78047e0244a9f7..c90622df7e4c032152641693b39364a2864abba9 160000 (submodule)
@@ -1 +1 @@
-Subproject commit d6fa07c12023662e16ace68bba78047e0244a9f7
+Subproject commit c90622df7e4c032152641693b39364a2864abba9
index b611728b5201a2f7750731a576d4366b308bebcb..79a7302baf97e1620ec58623ad391732e172668a 100644 (file)
@@ -39,6 +39,7 @@ int init_enemy(enemy_t *self, size_t start_tick) {
        self->CNAME[sz - 1] = '\0';
        
        self->start_tick = start_tick;
+       self->index = -1;
        
        return 1;
 }
index 57023265c107bbf9268a1b61b36b7e8dd7796020..2e1ca96269ae6883bd0be428dbca36e26cc61a9f 100644 (file)
@@ -24,6 +24,7 @@ typedef struct {
        size_t start_tick;
        int hp;
        int speed; // paths per tick
+       int index; // index in paths
 } enemy_t;
 
 /**
index ca2c7ff0af10f27715135ece1be81f205d81f323..bdc62393f3758d614e62dea0bed28edc20036ee1 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "engine.h"
 
-void move(engine_t *self, enemy_t *enemy, path_t *path);
+void move(engine_t *self, enemy_t *enemy);
 
 engine_t *new_engine(map_t *map) {
        engine_t *self = malloc(sizeof(engine_t));
@@ -64,10 +64,13 @@ void uninit_engine(engine_t *self) {
 }
 
 void engine_tick(engine_t *self) {
-printf("Tick is: %d\n", self->current_tick);
        array_clear(self->events);
        
        // TODO: all the rest
+       array_deloop(self->map->alive, ptr, enemy_t*) {
+               enemy_t *alive = *ptr;
+               move(self, alive);
+       }
        
        enemy_t *enemy;
        if (self->last_enemy)
@@ -76,18 +79,48 @@ printf("Tick is: %d\n", self->current_tick);
                enemy = array_first(self->map->enemies);
        
        // We allow only one enemy per tick (because one per path!)
-       if (enemy->start_tick == self->current_tick) {
-               move(self, enemy, array_first(self->map->paths));
+       if (enemy && enemy->start_tick == self->current_tick) {
+               self->last_enemy = enemy;
+               array_push(self->map->alive, &enemy);
+               move(self, enemy);
        }
        
        self->current_tick++;
 }
 
 
-void move(engine_t *self, enemy_t *enemy, path_t *path) {
-       if (path->enemy)
-               printf("woops: TODO");
+void move(engine_t *self, enemy_t *enemy) {
+       int source = enemy->index;
+       int target = source >= 0 ? source+1 : 0;
+       
+       path_t *path_from = NULL;
+       if (enemy->index >= 0)
+               path_from = array_get(self->map->paths, enemy->index);
+       path_t *path_to = array_get(self->map->paths, target);
+       
+       if (path_to && path_to->enemy)
+               printf("woops: TODO\n");
+       
+       if (path_from) {
+               if (path_from->enemy != enemy) {
+                       printf("TODO: DATA ERROR\n");
+                       return;
+               }
+               path_from->enemy = NULL;
+       }
+       
+       if (!path_to) {
+               printf("TODO: enemy left!\n");
+               return;
+       }
        
-       path->enemy = enemy;
+       if (path_to) {  
+               path_to->enemy = enemy;
+               enemy->index = path_to->index;
+       }
+printf("enemy moved from %d (%d,%d) to %d (%d,%d)\n",
+source, path_from?path_from->x:-1, path_from?path_from->y:-1,
+target, path_to  ?path_to  ->x:-1, path_to  ?path_to  ->y:-1
+);
 }
 
index 4c4b9142354c6e32b396a90ee60fe58bbaa4d990..976ed0fbf6f1feab9ca5473ea23655b055b96e8c 100644 (file)
@@ -77,14 +77,17 @@ int main(int argc, char **argv) {
        map_add_tower(map, tower);
        
        enemy_t *enemy = new_enemy(1);
+       enemy->speed = 1;
        map_enemy(map, enemy);
        
        engine_t *engine = new_engine(map);
-       engine_tick(engine);
        
-       display(map);
-       engine_tick(engine);
-       display(map);
+       printf("Paths: %d\n", map->paths->count);
+       for (int i = 0 ; i < 11 ; i++) {        
+               printf("Tick is: %d\n", engine->current_tick);
+               engine_tick(engine);
+               display(map);
+       }
        
        free_engine(engine);
        return 0;