diff options
-rw-r--r-- | sim/src/HitPoints.cpp | 11 | ||||
-rw-r--r-- | sim/tests/HitPoints.cpp | 6 |
2 files changed, 10 insertions, 7 deletions
diff --git a/sim/src/HitPoints.cpp b/sim/src/HitPoints.cpp index f850451..f23cafd 100644 --- a/sim/src/HitPoints.cpp +++ b/sim/src/HitPoints.cpp @@ -1,5 +1,7 @@ #include <kurator/sim/HitPoints.h> +#include <algorithm> + #include <kurator/universe/ShipType.h> @@ -23,11 +25,12 @@ HitPoints::Layer::consume(double& damage) if (damage <= 0.0 || points <= 0.0) return 0.0; const double modifier = 1.0 - resists; - const double actual_damage = damage * modifier; - const double left_to_deal = (actual_damage - points) / modifier; - points -= actual_damage; + const double potential_damage = damage * modifier; + const double taken_damage = std::min(potential_damage, points); + const double left_to_deal = (potential_damage - taken_damage) / modifier; + points -= taken_damage; damage = left_to_deal; - return actual_damage; + return taken_damage; } diff --git a/sim/tests/HitPoints.cpp b/sim/tests/HitPoints.cpp index 8b8ef84..5c90b4f 100644 --- a/sim/tests/HitPoints.cpp +++ b/sim/tests/HitPoints.cpp @@ -30,9 +30,9 @@ TEST(HitPoints, Deal) EXPECT_DOUBLE_EQ(300.0, points.total()); EXPECT_DOUBLE_EQ(50.0, points.deal(100.0)); EXPECT_DOUBLE_EQ(250.0, points.total()); - EXPECT_DOUBLE_EQ(50.0, points.deal(100.0)); - EXPECT_DOUBLE_EQ(200.0, points.total()); - EXPECT_DOUBLE_EQ(100.0, points.deal(125.0)); + EXPECT_DOUBLE_EQ(50.0 + 80.0, points.deal(200.0)); + EXPECT_DOUBLE_EQ(120.0, points.total()); + EXPECT_DOUBLE_EQ(20.0, points.deal(25.0)); EXPECT_DOUBLE_EQ(100.0, points.total()); EXPECT_DOUBLE_EQ(100.0, points.deal(200.0)); EXPECT_DOUBLE_EQ(0.0, points.total()); |