From 2dec4ec993f19607fe248926421e72f64b070741 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 1 Apr 2026 12:13:48 -0400 Subject: [PATCH] Body UI and damage works better now. --- assets/enemies.json | 2 +- src/combat/combat.cpp | 27 +++++++++++++++++---------- src/gui/body_ui.cpp | 5 ++++- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/assets/enemies.json b/assets/enemies.json index a81cf47..b874da5 100644 --- a/assets/enemies.json +++ b/assets/enemies.json @@ -6,7 +6,7 @@ "foreground": "enemies/fg:player", "background": "color:transparent" }, - {"_type": "Combat", "max_hp": 50, "max_ap": 12, "ap_delta": 6, "damage": 20, "dead": false, + {"_type": "Combat", "max_hp": 200, "max_ap": 12, "ap_delta": 6, "damage": 20, "dead": false, "body_parts": { "head": 200, "chest": 200, diff --git a/src/combat/combat.cpp b/src/combat/combat.cpp index 34c6807..6f93dd0 100644 --- a/src/combat/combat.cpp +++ b/src/combat/combat.cpp @@ -14,18 +14,25 @@ namespace components { } void Combat::take_damage(int my_dmg) { - int count = Random::uniform(1, int(body_parts.size() - 1)); + dbc::check(part_names.size() > 2, "Not enough body parts in part_names"); - while(count > 0) { - fmt::println("COUNT: {}", count); - for(auto& [key, hp] : body_parts) { - if(count > 0 && Random::uniform(0, 1) == 0) { - fmt::println("HIT! name={} count={} dmg={} hp={}", key, count, my_dmg, hp); - body_parts[key] = std::max(0, hp - my_dmg); - count--; - } - } + // select a random body part + size_t key = Random::uniform(size_t(0), part_names.size() - 1); + const std::string& name = part_names[key]; + int hp = body_parts[name]; + + // catch this bug + dbc::check(hp >= 0, "HP went negative"); + + // don't hit dead parts + if(hp == 0) { + dbc::log("IT's zero."); + return; } + + // don't go below 0 + body_parts[name] = std::max(0, hp - my_dmg); + fmt::println("BODY PART {} was {} now {}", name, hp, body_parts[name]); } bool Combat::less_than(int level) { diff --git a/src/gui/body_ui.cpp b/src/gui/body_ui.cpp index e02705e..61771de 100644 --- a/src/gui/body_ui.cpp +++ b/src/gui/body_ui.cpp @@ -29,6 +29,7 @@ namespace gui { auto gui_id = $gui.entity(name); $gui.set(gui_id, {guecs::to_wstring(name)}); + $gui.set(gui_id, {1, {255, 0, 0, 255}}); $gui.set(gui_id, {1.0f, THEME.DARK_MID, {}}); } @@ -49,8 +50,10 @@ namespace gui { auto gui_id = $gui.entity(key); if(auto meter = $gui.get_if(gui_id)) { - meter->percent = float(value) / 50.0; + meter->percent = float(value) / float(player_combat.max_hp); } + + $gui.show_text(key, fmt::format(L"{}: {}", guecs::to_wstring(key), value)); } }