#include #include #include namespace kurator { namespace sim { HitPoints::HitPoints(const universe::ShipType& def) : structure {def.base_structure_points, def.base_structure_resists}, armour {def.base_armour_points, def.base_armour_resists}, shield {def.base_shield_points, def.base_shield_resists} { } double HitPoints::Layer::consume(double& damage) { if (damage <= 0.0 || points <= 0.0) return 0.0; const double modifier = 1.0 - resists; 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 taken_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