int unit_type::resistance_against(const std::string& damage_name, bool attacker) const { int resistance = movement_type_.resistance_against(damage_name); unit_ability_list resistance_abilities; if (const config &abilities = cfg_.child("abilities")) { for (const config& cfg : abilities.child_range("resistance")) { if (!cfg["affect_self"].to_bool(true)) { continue; } if (!resistance_filter_matches(cfg, attacker, damage_name, 100 - resistance)) { continue; } resistance_abilities.push_back(unit_ability(&cfg, map_location::null_location())); } } if (!resistance_abilities.empty()) { unit_abilities::effect resist_effect(resistance_abilities, 100 - resistance, false); resistance = 100 - std::min<int>(resist_effect.get_composite_value(), resistance_abilities.highest("max_value").first); } return resistance; }
bool resistance_filter_matches(const config& cfg,bool attacker,const attack_type& damage_type) const {return resistance_filter_matches(cfg, attacker, damage_type.type()); };