tower_base, step 1
authorNiki Roo <niki@nikiroo.be>
Sat, 12 Apr 2025 15:08:45 +0000 (17:08 +0200)
committerNiki Roo <niki@nikiroo.be>
Sat, 12 Apr 2025 15:08:45 +0000 (17:08 +0200)
src/tdef/engine.c
src/tdef/engine.h
src/tdef/map.c
src/tdef/map.h
src/tdef/tdef.c
src/tdef/tower.c
src/tdef/tower.h

index 91cd5c8354b176f08974f1bb533c70ac4d5c634e..6ba12ae838e156708ca714dc650706d73901f1db 100644 (file)
@@ -47,6 +47,7 @@ int init_engine(engine_t *self, map_t *map) {
        self->events       = new_array(sizeof(event_t), 20);
        self->current_wave = -1;
        self->life         = 10;
+       self->bits         = 0;
        
        if (!self->waves || !self->events) {
                uninit_engine(self);
@@ -111,6 +112,28 @@ void engine_tick(engine_t *self) {
        self->current_tick++;
 }
 
+int engine_add_tower(engine_t *self, tower_t *tower) {
+       int x = tower->x;
+       int y = tower->y;
+       if (x < 0 || y < 0)
+               return 0;
+       if (x >= self->map->width || y >= self->map->height)
+               return 0;
+       if (self->map->data[y * self->map->width + x])
+               return 0;
+
+       tower_t **ptr = array_new(self->map->towers);
+       *ptr = tower;
+
+       self->map->data[y * self->map->width + x] = tower2any(tower);
+       return 1;
+}
+
+tower_base_t *setup_tower_base(engine_t *self) {
+       //TODO
+       return NULL;
+}
+
 int setup_wave(engine_t *self, int start_tick, int bits) {
        wave_t *wave = array_new(self->waves);
        if (!wave)
@@ -131,3 +154,19 @@ int setup_enemy(engine_t *self, enemy_t *enemy) {
        return wave_add_enemy(wave, enemy);
 }
 
+int setup_path(engine_t *self, int x, int y) {
+       if (x < 0 || y < 0)
+               return 0;
+       if (x >= self->map->width || y >= self->map->height)
+               return 0;
+       if (self->map->data[y * self->map->width + x])
+               return 0;
+
+       path_t *loc = array_new(self->map->paths);
+       init_path(loc, x, y);
+       loc->index = self->map->paths->count - 1;
+
+       self->map->data[y * self->map->width + x] = path2any(loc);
+       return 1;
+}
+
index 0b537ba9363f98647b3faa189c488b6e8c89ac41..969909a866dd0ffc4fb72d427f606b0536423e60 100644 (file)
@@ -31,6 +31,7 @@ typedef struct {
        enemy_t *last_enemy;
        int current_wave;
        int life;
+       int bits;
 } engine_t;
 
 /**
@@ -80,9 +81,15 @@ void uninit_engine(engine_t *self);
 // will clear events on start!
 void engine_tick(engine_t *self);
 
-int setup_enemy(engine_t *self, enemy_t *enemy);
+int engine_add_tower(engine_t *self, tower_t *tower);
+
+tower_base_t *setup_tower_base(engine_t *self);
 
 int setup_wave(engine_t *self, int start_tick, int bits);
 
+int setup_enemy(engine_t *self, enemy_t *enemy);
+
+int setup_path(engine_t *self, int x, int y);
+
 #endif /* ENGINE_H */
 
index c4f504762e0daa91c9af04d3681a361219a845ac..372ce1fe1cc45daa7686654b1e0d571790ca1c7d 100644 (file)
@@ -77,8 +77,8 @@ void uninit_map(map_t *self) {
        self->CNAME[0] = '!';
        
        if (self->towers) {
-               array_loop(self->towers, tower, tower_t*) {
-                       free_tower(*tower);
+               array_loop(self->towers, ptr, tower_t*) {
+                       free_tower(*ptr);
                }
        }
        
@@ -139,7 +139,9 @@ 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) {
+       array_loop(self->towers, ptr, tower_t*) {
+               tower_t *tower = *ptr;
+               
                tower_rearm(tower);
                proj_t *target = tower_fire(tower, current_tick,
                                self->alive, self->paths);
@@ -172,39 +174,6 @@ void map_hit_1(map_t *self, int current_tick, array_t *events) {
        }
 }
 
-int setup_path(map_t *self, int x, int y) {
-       if (x < 0 || y < 0)
-               return 0;
-       if (x >= self->width || y >= self->height)
-               return 0;
-       if (self->data[y * self->width + x])
-               return 0;
-       
-       path_t *loc = array_new(self->paths);
-       init_path(loc, x, y);
-       loc->index = self->paths->count - 1;
-       
-       self->data[y * self->width + x] = path2any(loc);
-       return 1;
-}
-
-int setup_tower(map_t *self, tower_t *tower) {
-       int x = tower->x;
-       int y = tower->y;
-       if (x < 0 || y < 0)
-               return 0;
-       if (x >= self->width || y >= self->height)
-               return 0;
-       if (self->data[y * self->width + x])
-               return 0;
-       
-       tower_t **ttt = array_new(self->towers);
-       *ttt = tower;
-       
-       self->data[y * self->width + x] = tower2any(tower);
-       return 1;
-}
-
 void move(map_t *self, enemy_t *enemy, array_t *events, int reverse) {
        int source = enemy->index;
        int target = source >= 0 ? source+1 : 0;
index de4e544fbdab848a06a80ebfc83eae51f7de2014..cf1f49ee2c9a7640ad3a7c1f300c0bbffd2606b7 100644 (file)
@@ -87,9 +87,5 @@ void map_fire_1(map_t *self, int current_tick, array_t *events);
 
 void map_hit_1(map_t *self, int current_tick, array_t *events);
 
-int setup_path(map_t *self, int x, int y);
-
-int setup_tower(map_t *self, tower_t *tower);
-
 #endif /* MAP_H */
 
index eae7a766e8f191e1b8246119f147f4dd84baddcd..abc50a77fb864a1879d96ac562624707992529d4 100644 (file)
@@ -112,7 +112,7 @@ int process_cmd(command_t *cmd, engine_t *engine) {
        case FILE404:
                fprintf(stderr, "Unknown file(s):\n");
                array_loop_i (cmd->data, ptr, char*, i) {
-                       fprintf(stderr, "%d. \"%s\"\n", (i+1), *ptr);
+                       fprintf(stderr, "%zu. \"%s\"\n", (i+1), *ptr);
                }
                break;
        case UNKNOWN:
@@ -149,17 +149,23 @@ int main(int argc, char **argv) {
                return 1;
        }
        
-       setup_path(map, 0, 0);
-       setup_path(map, 1, 0);
-       setup_path(map, 2, 0);
-       setup_path(map, 3, 0);
-       setup_path(map, 3, 1);
-       setup_path(map, 3, 2);
-       setup_path(map, 4, 2);
-       setup_path(map, 5, 2);
+       setup_path(engine, 0, 0);
+       setup_path(engine, 1, 0);
+       setup_path(engine, 2, 0);
+       setup_path(engine, 3, 0);
+       setup_path(engine, 3, 1);
+       setup_path(engine, 3, 2);
+       setup_path(engine, 4, 2);
+       setup_path(engine, 5, 2);
        
-       tower_t *tower = new_tower(2, 1);
-       setup_tower(map, tower);
+       tower_base_t base;
+       init_tower_base(&base, 0);
+       
+       tower_t *tower = new_tower(&base, 2, 1);
+       // TODO: fix setup_tower_base
+       // TODO: use the tower base array (0 or 1.. instead of base)
+       // TODO: use bits
+       engine_add_tower(engine, tower);
        
        enemy_t *enemy = new_enemy(0, 1);
        enemy->speed = 1;
index de58076f7659e16549679244d5ca13c3f66254ad..32817c9c14ad420cd9d1c2e93ccaf8d45b6f41e3 100644 (file)
@@ -22,9 +22,9 @@
 
 #include "tower.h"
 
-tower_t *new_tower(int x, int y) {
+tower_t *new_tower(tower_base_t *base, int x, int y) {
        tower_t *self = malloc(sizeof(tower_t));
-       if (!init_tower(self, x, y)) {
+       if (!init_tower(self, base, x, y)) {
                free(self);
                self = NULL;
        }
@@ -32,18 +32,20 @@ tower_t *new_tower(int x, int y) {
        return self;
 }
 
-int init_tower(tower_t *self, int x, int y) {
+int init_tower(tower_t *self, tower_base_t *base, int x, int y) {
        size_t sz = sizeof(self->CNAME);
        strncpy(self->CNAME, "[tower          ", sz);
        self->CNAME[sz - 2] = ']';
        self->CNAME[sz - 1] = '\0';
        
+       self->base         = base;
        self->x            = x;
        self->y            = y;
-       self->range        = 0;
-       self->speed        = 0;
+       self->lvl_speed    = 0;
+       self->lvl_range    = 0;
+       self->lvl_range    = 0;
+       self->proj_speed   = 1;
        self->super        = 0;
-       self->fire_delay   = 0;
        self->fire_delayed = 0;
        
        init_proj_desc(&self->projectile);
@@ -62,6 +64,15 @@ void uninit_tower(tower_t *self) {
        self->CNAME[0] = '!';
 }
 
+int init_tower_base(tower_base_t *self, int type) {
+       self->type        = type;
+       self->stats_sz    = 0;
+       self->super_cost  = 0;
+       self->super_power = 0;
+       memset(self->stats, '\0', sizeof(self->stats));
+       return 1;
+}
+
 void tower_rearm(tower_t *self) {
        if (self->fire_delayed > 0)
                self->fire_delayed--;
@@ -86,7 +97,7 @@ proj_t *tower_fire(tower_t *self, int current_tick, array_t *enemies,
        proj->desc.damage = 10; // TODO
        proj->boom_tick = current_tick + 3; // TODO: compute from speed
        
-       self->fire_delayed = self->fire_delay;
+       self->fire_delayed = self->base->stats[self->lvl_speed].attack;
        
        return proj;
 }
index 103b92e850b915ea1671296527013b51a234184d..6a30bc6078be567af95f43c6ec5b813fd0b910df 100644 (file)
 #include "cutils/array.h"
 #include "proj.h"
 
+typedef struct {
+       int attack;
+       int speed; // fire_delay in ticks
+       int range;
+       int cost; // upgrade cost in bits
+} tower_lvl_t;
+
+typedef struct {
+       int type; // identify the unique tower type
+       tower_lvl_t stats[6];
+       int stats_sz; // how many are used
+       int super_cost;
+       int super_power;
+} tower_base_t;
+
 /**
  * @brief bla
  *
  */
 typedef struct {
        char CNAME[10];
+       tower_base_t *base;
        int x;
        int y;
-       int range;
-       int speed; // speed of the proj in locs per tick 
+       // levels are 0-based
+       int lvl_attack;
+       int lvl_speed; // speed = fire_delay in ticks
+       int lvl_range;
+       int proj_speed; // speed of the proj in locs per tick 
        int super;
-       int fire_delay; // in ticks
        int fire_delayed; // in ticks still to wait
+       int cost; // total cost in bits
        proj_desc_t projectile;
 } tower_t;
 
 /**
  * Create a new tower.
  *
+ * @param base the type of tower (will NOT be free'd by this object)
  * @param x the X coordinate
  * @param y the Y coordinate
  *
@@ -45,15 +65,16 @@ typedef struct {
  *
  * @return a new tower (you must later call `free_tower()`)
  */
-tower_t *new_tower(int x, int y);
+tower_t *new_tower(tower_base_t *base, int x, int y);
 
 /**
  * Initialise a new tower.
  *
+ * @param base the type of tower (will NOT be free'd by this object)
  * @param x the X coordinate
  * @param y the Y coordinate
  */
-int init_tower(tower_t *self, int x, int y);
+int init_tower(tower_t *self, tower_base_t *base, int x, int y);
 
 /** 
  * Free the resources held for the given tower: you must not use it any more.
@@ -76,6 +97,8 @@ void free_tower(tower_t *self);
  */
 void uninit_tower(tower_t *self);
 
+int init_tower_base(tower_base_t *self, int type);
+
 void tower_rearm(tower_t *self);
 
 proj_t *tower_fire(tower_t *self, int current_tick, array_t *enemies,