Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
	bool resistance_filter_matches(const config& cfg,bool attacker,const attack_type& damage_type) const
	{return resistance_filter_matches(cfg, attacker, damage_type.type()); };