From 926c721674cd81b4fc01fac1ffaa74f056f6ab61 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 12 Apr 2025 17:08:45 +0200 Subject: [PATCH] tower_base, step 1 --- src/tdef/engine.c | 39 +++++++++++++++++++++++++++++++++++++++ src/tdef/engine.h | 9 ++++++++- src/tdef/map.c | 41 +++++------------------------------------ src/tdef/map.h | 4 ---- src/tdef/tdef.c | 28 +++++++++++++++++----------- src/tdef/tower.c | 25 ++++++++++++++++++------- src/tdef/tower.h | 33 ++++++++++++++++++++++++++++----- 7 files changed, 115 insertions(+), 64 deletions(-) diff --git a/src/tdef/engine.c b/src/tdef/engine.c index 91cd5c8..6ba12ae 100644 --- a/src/tdef/engine.c +++ b/src/tdef/engine.c @@ -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; +} + diff --git a/src/tdef/engine.h b/src/tdef/engine.h index 0b537ba..969909a 100644 --- a/src/tdef/engine.h +++ b/src/tdef/engine.h @@ -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 */ diff --git a/src/tdef/map.c b/src/tdef/map.c index c4f5047..372ce1f 100644 --- a/src/tdef/map.c +++ b/src/tdef/map.c @@ -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; diff --git a/src/tdef/map.h b/src/tdef/map.h index de4e544..cf1f49e 100644 --- a/src/tdef/map.h +++ b/src/tdef/map.h @@ -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 */ diff --git a/src/tdef/tdef.c b/src/tdef/tdef.c index eae7a76..abc50a7 100644 --- a/src/tdef/tdef.c +++ b/src/tdef/tdef.c @@ -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; diff --git a/src/tdef/tower.c b/src/tdef/tower.c index de58076..32817c9 100644 --- a/src/tdef/tower.c +++ b/src/tdef/tower.c @@ -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; } diff --git a/src/tdef/tower.h b/src/tdef/tower.h index 103b92e..6a30bc6 100644 --- a/src/tdef/tower.h +++ b/src/tdef/tower.h @@ -15,6 +15,21 @@ #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 * @@ -22,19 +37,24 @@ */ 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, -- 2.27.0