From eec22cd7915eb740e03d52bc1891c0fc98e841b5 Mon Sep 17 00:00:00 2001 From: Grant Horner Date: Tue, 2 Dec 2025 19:53:44 -0500 Subject: [PATCH] give enemies hp --- main.cpp | 34 ++++++++++++++++++---------------- rng.cpp | 2 +- types.h | 3 ++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/main.cpp b/main.cpp index 074813c..e4bdbae 100644 --- a/main.cpp +++ b/main.cpp @@ -90,32 +90,33 @@ struct EnemySpawner final : Spawner { const auto starting_y = Rng::generate(static_cast(viewport.level_top), static_cast(viewport.level_bottom)); - for (auto &[center, radius, speed, alive]: this->values) { - if (alive) continue; - alive = true; - radius = enemy_radius; + for (auto &enemy: this->values) { + if (enemy.alive()) continue; + enemy.radius = enemy_radius; + auto hp = Rng::generate(1, 4); + enemy.hp = static_cast(hp); if (num < 0.25) { - center = {.x = starting_x, .y = viewport.level_top}; + enemy.center = {.x = starting_x, .y = viewport.level_top}; } else if (0.25 <= num && num < 0.5) { - center = { + enemy.center = { .x = starting_x, .y = viewport.level_bottom }; } else if (0.5 <= num && num < 0.75) { - center = {.x = viewport.level_left, .y = starting_y}; + enemy.center = {.x = viewport.level_left, .y = starting_y}; } else { - center = { + enemy.center = { .x = viewport.level_right, .y = starting_y }; } - speed = Rng::generate(static_cast(enemy_max_speed)); + enemy.speed = Rng::generate(static_cast(enemy_max_speed)); break; } } }; -EnemySpawner enemy_spawner{2}; +EnemySpawner enemy_spawner{1}; struct ItemSpawner final : Spawner { explicit ItemSpawner(const long long rate_secs) : Spawner(rate_secs) { @@ -164,10 +165,9 @@ void update_tears() { } enemy_spawner.for_each([¢er, &active](auto &enemy) { - if (enemy.alive && CheckCollisionCircles(center, player.tear_radius, enemy.center, enemy.radius)) { + if (enemy.alive() && CheckCollisionCircles(center, player.tear_radius, enemy.center, enemy.radius)) { active = false; - enemy.alive = false; - score++; + if (--enemy.hp == 0) score++; } }); @@ -266,13 +266,15 @@ int main() { } enemy_spawner.for_each([now](Enemy &enemy) { - if (enemy.alive) { + if (enemy.alive()) { enemy.center = Vector2MoveTowards(enemy.center, player.center(), enemy.speed); - DrawCircleV(enemy.center, enemy.radius, RED); + const Color enemy_color = enemy.hp == 1 ? PINK : enemy.hp == 2 ? ORANGE : RED; + DrawCircleV(enemy.center, enemy.radius, enemy_color); if (enemy.center.x < viewport.level_left || viewport.level_right < enemy.center.x || enemy.center.y < viewport.level_top || viewport.level_bottom < enemy.center.y) { - enemy.alive = false; + // Basically removing the enemy from the pool; + enemy.hp = 0; } if (CheckCollisionCircleRec(enemy.center, enemy.radius, player.rect) && diff --git a/rng.cpp b/rng.cpp index ad27483..f572ed4 100644 --- a/rng.cpp +++ b/rng.cpp @@ -13,5 +13,5 @@ float Rng::generate(const uint32_t max) { } float Rng::generate(const int min, const int max) { - return generate() * (static_cast(max) - static_cast(min)) + static_cast(min); + return generate(max - min) + static_cast(min); } diff --git a/types.h b/types.h index 78e34a9..7a0be32 100644 --- a/types.h +++ b/types.h @@ -49,7 +49,8 @@ struct Enemy { Vector2 center; float radius; float speed; - bool alive; + uint32_t hp; + [[nodiscard]] bool alive() const noexcept { return hp != 0; } }; enum ItemType {