#include namespace kurator { namespace sim { HitPoints::HitPoints(double base_shield, double base_armour, double base_structure) : structure {base_structure}, armour {base_armour}, shield {base_shield} { } double HitPoints::Layer::consume(double& damage) { if (damage <= 0.0 || points <= 0.0) return 0.0; const double actual_damage = damage * resists; const double left_to_deal = (actual_damage - points) / resists; points -= actual_damage; damage = left_to_deal; return actual_damage; } double HitPoints::deal(double damage) { return shield.consume(damage) + armour.consume(damage) + structure.consume(damage); } bool HitPoints::is_alive() const { return structure.points > 0.0; } double HitPoints::total() const { return shield.points + armour.points + structure.points; } } // namespace sim } // namespace kurator